From 2ada5977cd46f0ebf0e06f00b7ee8761099564d1 Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Wed, 2 Dec 2020 17:53:06 -0800 Subject: [PATCH 01/32] Flattern the createVariableExpr wrapper (#581) --- .../ServiceClientSampleCodeComposer.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index c4a2e5f4f8..98d66d3148 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -44,7 +44,9 @@ public static String composeClassHeaderCredentialsSampleCode( .setName("myCredentials") .setPakkage(clientType.reference().pakkage()) .build()); - VariableExpr settingsVarExpr = createVariableExpr(settingsName, settingsType); + VariableExpr settingsVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(settingsName).setType(settingsType).build()); MethodInvocationExpr newBuilderMethodExpr = MethodInvocationExpr.builder() .setStaticReferenceType(settingsType) @@ -52,10 +54,13 @@ public static String composeClassHeaderCredentialsSampleCode( .build(); TypeNode fixedCredentialProvideType = TypeNode.withReference(ConcreteReference.withClazz(FixedCredentialsProvider.class)); + VariableExpr myCredentialVarExpr = + VariableExpr.withVariable( + Variable.builder().setName("myCredentials").setType(myCredentialsType).build()); MethodInvocationExpr credentialArgExpr = MethodInvocationExpr.builder() .setStaticReferenceType(fixedCredentialProvideType) - .setArguments(createVariableExpr("myCredentials", myCredentialsType)) + .setArguments(myCredentialVarExpr) .setMethodName("create") .build(); MethodInvocationExpr credentialsMethodExpr = @@ -78,7 +83,9 @@ public static String composeClassHeaderCredentialsSampleCode( // Initialized client with create() method. // e.g. EchoClient echoClient = EchoClient.create(echoSettings); - VariableExpr clientVarExpr = createVariableExpr(clientName, clientType); + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(clientName).setType(clientType).build()); MethodInvocationExpr createMethodExpr = MethodInvocationExpr.builder() .setStaticReferenceType(clientType) @@ -109,16 +116,21 @@ public static String composeClassHeaderEndpointSampleCode( .setName("myEndpoint") .setPakkage(clientType.reference().pakkage()) .build()); - VariableExpr settingsVarExpr = createVariableExpr(settingsName, settingsType); + VariableExpr settingsVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(settingsName).setType(settingsType).build()); MethodInvocationExpr newBuilderMethodExpr = MethodInvocationExpr.builder() .setStaticReferenceType(settingsType) .setMethodName("newBuilder") .build(); + VariableExpr myEndpointVarExpr = + VariableExpr.withVariable( + Variable.builder().setName("myEndpoint").setType(myEndpointType).build()); MethodInvocationExpr credentialsMethodExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(newBuilderMethodExpr) - .setArguments(createVariableExpr("myEndpoint", myEndpointType)) + .setArguments(myEndpointVarExpr) .setMethodName("setEndpoint") .build(); MethodInvocationExpr buildMethodExpr = @@ -136,7 +148,9 @@ public static String composeClassHeaderEndpointSampleCode( // Initialize client with create() method. // e.g. EchoClient echoClient = EchoClient.create(echoSettings); - VariableExpr clientVarExpr = createVariableExpr(clientName, clientType); + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(clientName).setType(clientType).build()); MethodInvocationExpr createMethodExpr = MethodInvocationExpr.builder() .setStaticReferenceType(clientType) @@ -155,11 +169,4 @@ public static String composeClassHeaderEndpointSampleCode( ExprStatement.withExpr(initSettingsVarExpr), ExprStatement.withExpr(initClientVarExpr))); } - - // ======================================== Helpers ==========================================// - - private static VariableExpr createVariableExpr(String variableName, TypeNode type) { - return VariableExpr.withVariable( - Variable.builder().setName(variableName).setType(type).build()); - } } From 0b70f9dc39293979978ca8e048f9c504a2daa2ae Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Tue, 8 Dec 2020 17:15:29 -0800 Subject: [PATCH 02/32] [samplecode][1/3]Implement Pure Unary RPC sample code (#573) --- .../generator/gapic/composer/Composer.java | 14 +- .../composer/ServiceClientClassComposer.java | 41 +- .../ServiceClientCommentComposer.java | 12 +- .../ServiceClientSampleCodeComposer.java | 151 +++- .../api/generator/gapic/composer/BUILD.bazel | 2 + .../ServiceClientClassComposerTest.java | 6 +- .../ServiceClientSampleCodeComposerTest.java | 654 ++++++++++++++++++ .../gapic/composer/goldens/EchoClient.golden | 72 ++ .../composer/goldens/IdentityClient.golden | 64 ++ .../goldens/asset/AssetServiceClient.java | 63 ++ .../goldens/library/LibraryServiceClient.java | 172 +++++ .../goldens/logging/ConfigClient.java | 237 +++++++ .../goldens/logging/LoggingClient.java | 44 ++ .../goldens/logging/MetricsClient.java | 76 ++ .../goldens/redis/CloudRedisClient.java | 18 + 15 files changed, 1605 insertions(+), 21 deletions(-) create mode 100644 src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 02e1dc9bcc..adf5f03432 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -60,8 +60,8 @@ public static List generateServiceClasses( @Nonnull Map resourceNames, @Nonnull Map messageTypes) { List clazzes = new ArrayList<>(); - clazzes.addAll(generateStubClasses(service, serviceConfig, messageTypes)); - clazzes.addAll(generateClientSettingsClasses(service, messageTypes)); + clazzes.addAll(generateStubClasses(service, serviceConfig, messageTypes, resourceNames)); + clazzes.addAll(generateClientSettingsClasses(service, messageTypes, resourceNames)); clazzes.addAll(generateMocksAndTestClasses(service, resourceNames, messageTypes)); // TODO(miraleung): Generate test classes. return clazzes; @@ -76,7 +76,10 @@ public static List generateResourceNameHelperClasses( } public static List generateStubClasses( - Service service, GapicServiceConfig serviceConfig, Map messageTypes) { + Service service, + GapicServiceConfig serviceConfig, + Map messageTypes, + Map resourceNames) { List clazzes = new ArrayList<>(); clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes)); clazzes.add( @@ -87,9 +90,10 @@ public static List generateStubClasses( } public static List generateClientSettingsClasses( - Service service, Map messageTypes) { + Service service, Map messageTypes, Map resourceNames) { List clazzes = new ArrayList<>(); - clazzes.add(ServiceClientClassComposer.instance().generate(service, messageTypes)); + clazzes.add( + ServiceClientClassComposer.instance().generate(service, messageTypes, resourceNames)); clazzes.add(ServiceSettingsClassComposer.instance().generate(service, messageTypes)); return clazzes; } diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index e6fec42bd9..97982a32c4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -62,6 +62,7 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.annotations.VisibleForTesting; @@ -79,12 +80,13 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Generated; -public class ServiceClientClassComposer implements ClassComposer { +public class ServiceClientClassComposer { private static final ServiceClientClassComposer INSTANCE = new ServiceClientClassComposer(); private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; private static final String CALLABLE_NAME_PATTERN = "%sCallable"; @@ -108,8 +110,8 @@ public static ServiceClientClassComposer instance() { return INSTANCE; } - @Override - public GapicClass generate(Service service, Map messageTypes) { + public GapicClass generate( + Service service, Map messageTypes, Map resourceNames) { Map types = createTypes(service, messageTypes); String className = getClientClassName(service); GapicClass.Kind kind = Kind.MAIN; @@ -129,7 +131,8 @@ public GapicClass generate(Service service, Map messageTypes) { .setName(className) .setImplementsTypes(createClassImplements(types)) .setStatements(createFieldDeclarations(service, types, hasLroClient)) - .setMethods(createClassMethods(service, messageTypes, types, hasLroClient)) + .setMethods( + createClassMethods(service, messageTypes, types, resourceNames, hasLroClient)) .setNestedClasses(createNestedPagingClasses(service, messageTypes, types)) .build(); return GapicClass.create(kind, classDef); @@ -152,12 +155,13 @@ private static List createClassMethods( Service service, Map messageTypes, Map types, + Map resourceNames, boolean hasLroClient) { List methods = new ArrayList<>(); methods.addAll(createStaticCreatorMethods(service, types)); methods.addAll(createConstructorMethods(service, types, hasLroClient)); methods.addAll(createGetterMethods(service, types, hasLroClient)); - methods.addAll(createServiceMethods(service, messageTypes, types)); + methods.addAll(createServiceMethods(service, messageTypes, types, resourceNames)); methods.addAll(createBackgroundResourceMethods(service, types)); return methods; } @@ -471,11 +475,16 @@ private static List createGetterMethods( } private static List createServiceMethods( - Service service, Map messageTypes, Map types) { + Service service, + Map messageTypes, + Map types, + Map resourceNames) { List javaMethods = new ArrayList<>(); for (Method method : service.methods()) { if (method.stream().equals(Stream.NONE)) { - javaMethods.addAll(createMethodVariants(method, messageTypes, types)); + javaMethods.addAll( + createMethodVariants( + method, getClientClassName(service), messageTypes, types, resourceNames)); javaMethods.add(createMethodDefaultMethod(method, types)); } if (method.hasLro()) { @@ -490,7 +499,11 @@ private static List createServiceMethods( } private static List createMethodVariants( - Method method, Map messageTypes, Map types) { + Method method, + String clientName, + Map messageTypes, + Map types, + Map resourceNames) { List javaMethods = new ArrayList<>(); String methodName = JavaStyle.toLowerCamelCase(method.name()); TypeNode methodInputType = method.inputType(); @@ -552,10 +565,20 @@ private static List createMethodVariants( .setReturnType(methodOutputType) .build(); + Optional methodSampleCode = Optional.empty(); + if (!method.isPaged() && !method.hasLro()) { + // TODO(summerji): Remove the condition check once finished the implementation on paged + // sample code and lro sample code. + methodSampleCode = + Optional.of( + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, types.get(clientName), signature, resourceNames)); + } MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() .setHeaderCommentStatements( - ServiceClientCommentComposer.createRpcMethodHeaderComment(method, signature)) + ServiceClientCommentComposer.createRpcMethodHeaderComment( + method, signature, methodSampleCode)) .setScope(ScopeNode.PUBLIC) .setIsFinal(true) .setName(String.format(method.hasLro() ? "%sAsync" : "%s", methodName)) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java index 09507cd30f..2522f5afa5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -162,7 +163,7 @@ static CommentStatement createCreateMethodStubArgComment( } static List createRpcMethodHeaderComment( - Method method, List methodArguments) { + Method method, List methodArguments, Optional sampleCode) { JavaDocComment.Builder methodJavadocBuilder = JavaDocComment.builder(); if (method.hasDescription()) { @@ -170,8 +171,10 @@ static List createRpcMethodHeaderComment( processProtobufComment(method.description(), methodJavadocBuilder, null); } - // methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); - // TODO(summerji): Add sample code here and uncomment the above. + if (sampleCode.isPresent()) { + methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); + methodJavadocBuilder.addSampleCode(sampleCode.get()); + } if (methodArguments.isEmpty()) { methodJavadocBuilder.addParam( @@ -196,7 +199,8 @@ static List createRpcMethodHeaderComment( } static List createRpcMethodHeaderComment(Method method) { - return createRpcMethodHeaderComment(method, Collections.emptyList()); + // TODO(summerji): Refactor this method when implement default method sample code. + return createRpcMethodHeaderComment(method, Collections.emptyList(), Optional.empty()); } static CommentStatement createMethodNoArgComment(String serviceName) { diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 98d66d3148..b009d079c4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -20,18 +20,29 @@ import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; 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.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class ServiceClientSampleCodeComposer { - // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. public static String composeClassHeaderCredentialsSampleCode( + // TODO(summerji): Add unit tests for composeClassHeaderCredentialsSampleCode. TypeNode clientType, TypeNode settingsType) { // Initialize clientSettings with builder() method. // e.g. EchoSettings echoSettings = @@ -105,6 +116,7 @@ public static String composeClassHeaderCredentialsSampleCode( } public static String composeClassHeaderEndpointSampleCode( + // TODO(summerji): Add unit tests for composeClassHeaderEndpointSampleCode. TypeNode clientType, TypeNode settingsType) { // Initialize client settings with builder() method. // e.g. EchoSettings echoSettings = EchoSettings.newBuilder().setEndpoint("myEndpoint").build(); @@ -169,4 +181,141 @@ public static String composeClassHeaderEndpointSampleCode( ExprStatement.withExpr(initSettingsVarExpr), ExprStatement.withExpr(initClientVarExpr))); } + + public static String composeRpcMethodHeaderSampleCode( + Method method, + TypeNode clientType, + List arguments, + Map resourceNames) { + // TODO(summerji): Add other types RPC methods' sample code. + return SampleCodeWriter.write( + composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames)); + } + + @VisibleForTesting + static TryCatchStatement composeUnaryRpcMethodSampleCode( + Method method, + TypeNode clientType, + List arguments, + Map resourceNames) { + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) + .setType(clientType) + .build()); + // List of rpc method arguments' variable expressions. + List rpcMethodArgVarExprs = + arguments.stream() + .map( + arg -> + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(arg.type()) + .build())) + .collect(Collectors.toList()); + // List of rpc method arguments' default value expression. + List resourceNameList = + resourceNames.values().stream().collect(Collectors.toList()); + List rpcMethodArgDefaultValueExprs = + arguments.stream() + .map( + arg -> + !isStringTypedResourceName(arg, resourceNames) + ? DefaultValueComposer.createDefaultValue(arg, resourceNames) + : MethodInvocationExpr.builder() + .setExprReferenceExpr( + DefaultValueComposer.createDefaultValue( + resourceNames.get( + arg.field().resourceReference().resourceTypeString()), + resourceNameList, + arg.field().name())) + .setMethodName("toString") + .setReturnType(TypeNode.STRING) + .build()) + .collect(Collectors.toList()); + + List bodyExprs = new ArrayList<>(); + Preconditions.checkState( + rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), + "Expected the number of method arguments to match the number of default values."); + bodyExprs.addAll( + IntStream.range(0, rpcMethodArgVarExprs.size()) + .mapToObj( + i -> + AssignmentExpr.builder() + .setVariableExpr( + (rpcMethodArgVarExprs.get(i)).toBuilder().setIsDecl(true).build()) + .setValueExpr(rpcMethodArgDefaultValueExprs.get(i)) + .build()) + .collect(Collectors.toList())); + // Invoke current method based on return type. + // e.g. if return void, echoClient.echo(..); or, + // e.g. if return other type, EchoResponse response = echoClient.echo(...); + boolean returnsVoid = isProtoEmptyType(method.outputType()); + if (returnsVoid) { + bodyExprs.add( + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments( + rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList())) + .setReturnType(clientType) + .build()); + } else { + VariableExpr responseVarExpr = + VariableExpr.withVariable( + Variable.builder().setName("response").setType(method.outputType()).build()); + MethodInvocationExpr clientMethodInvocationExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments( + rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList())) + .setReturnType(responseVarExpr.variable().type()) + .build(); + bodyExprs.add( + AssignmentExpr.builder() + .setVariableExpr(responseVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(clientMethodInvocationExpr) + .build()); + } + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody( + bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) + .setIsSampleCode(true) + .build(); + } + + // ==================================Helpers===================================================// + + // Assign client variable expr with create client. + // e.g EchoClient echoClient = EchoClient.create() + private static AssignmentExpr assignClientVariableWithCreateMethodExpr( + VariableExpr clientVarExpr) { + return AssignmentExpr.builder() + .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType(clientVarExpr.variable().type()) + .setReturnType(clientVarExpr.variable().type()) + .setMethodName("create") + .build()) + .build(); + } + + private static boolean isStringTypedResourceName( + MethodArgument arg, Map resourceNames) { + return arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString()); + } + + private static boolean isProtoEmptyType(TypeNode type) { + return type.reference().pakkage().equals("com.google.protobuf") + && type.reference().name().equals("Empty"); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index 0e0e941a90..4a91509696 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -22,6 +22,7 @@ TESTS = UPDATE_GOLDENS_TESTS + [ "DefaultValueComposerTest", "ResourceNameTokenizerTest", "RetrySettingsComposerTest", + "ServiceClientSampleCodeComposerTest", ] TEST_DEPS = [ @@ -38,6 +39,7 @@ TEST_DEPS = [ "//src/main/java/com/google/api/generator/gapic/protoparser", "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "@com_google_api_api_common//jar", "@com_google_api_gax_java//gax", "@com_google_googleapis//google/logging/v2:logging_java_proto", "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 1a882a6a30..a45784aaa2 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -53,7 +53,8 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - ServiceClientClassComposer.instance().generate(echoProtoService, messageTypes); + ServiceClientClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -76,7 +77,8 @@ public void generateServiceClasses_methodSignatureHasNestedFields() { fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service protoService = services.get(0); - GapicClass clazz = ServiceClientClassComposer.instance().generate(protoService, messageTypes); + GapicClass clazz = + ServiceClientClassComposer.instance().generate(protoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java new file mode 100644 index 0000000000..384f2d97c1 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -0,0 +1,654 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer; + +import static junit.framework.Assert.assertEquals; + +import com.google.api.generator.engine.ast.ConcreteReference; +import com.google.api.generator.engine.ast.Reference; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.VaporReference; +import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Field; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.model.ResourceReference; +import com.google.api.generator.gapic.protoparser.Parser; +import com.google.api.generator.testutils.LineFormatter; +import com.google.protobuf.Descriptors.FileDescriptor; +import com.google.showcase.v1beta1.EchoOuterClass; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.junit.Assert; +import org.junit.Test; + +public class ServiceClientSampleCodeComposerTest { + private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1"; + + @Test + public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + List methodArguments = Collections.emptyList(); + Method method = + Method.builder() + .setName("echo") + .setMethodSignatures(Arrays.asList(methodArguments)) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, clientType, methodArguments, resourceNames); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " EchoResponse response = echoClient.echo();\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode resourceNameType = + TypeNode.withReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(resourceNameType) + .setField( + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withType("showcase.googleapis.com/AnythingGoes")) + .build()) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n", + " EchoResponse response = echoClient.echo(parent);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder() + .setName("FoobarName") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .setSupertypeReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + .build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(methodArgType) + .setField(methodArgField) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n", + " EchoResponse response = echoClient.echo(name);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " EchoResponse response = echoClient.echo(name);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + Field methodArgField = + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " EchoResponse response = echoClient.echo(parent);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); + Field methodArgField = + Field.builder() + .setName("error") + .setType(methodArgType) + .setIsMessage(true) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("error") + .setType(methodArgType) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " Status error = Status.newBuilder().build();\n", + " EchoResponse response = echoClient.echo(error);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + Field methodArgField = + Field.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + Reference userRef = + VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build(); + Field nestFiled = + Field.builder() + .setName("user") + .setType(TypeNode.withReference(userRef)) + .setIsMessage(true) + .build(); + MethodArgument argDisplayName = + MethodArgument.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .setNestedFields(Arrays.asList(nestFiled)) + .build(); + MethodArgument argOtherName = + MethodArgument.builder() + .setName("other_name") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("other_name").setType(TypeNode.STRING).build()) + .setNestedFields(Arrays.asList(nestFiled)) + .build(); + List> signatures = + Arrays.asList(Arrays.asList(argDisplayName, argOtherName)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " String otherName = \"otherName-1946065477\";\n", + " EchoResponse response = echoClient.echo(displayName, otherName);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + Field methodArgField = + Field.builder() + .setName("content") + .setType(TypeNode.STRING) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String content = \"content951530617\";\n", + " EchoResponse response = echoClient.echo(content);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + MethodArgument arg1 = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("content").setType(TypeNode.STRING).build()) + .build(); + TypeNode severityType = + TypeNode.withReference( + VaporReference.builder().setName("Severity").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + MethodArgument arg2 = + MethodArgument.builder() + .setName("severity") + .setType(severityType) + .setField( + Field.builder().setName("severity").setType(severityType).setIsEnum(true).build()) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg1, arg2)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String content = \"content951530617\";\n", + " Severity severity = Severity.forNumber(0);\n", + " EchoResponse response = echoClient.echo(content, severity);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_noMethodArguments() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + List> signatures = Arrays.asList(Collections.emptyList()); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, signatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " EchoResponse response = echoClient.echo();\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("DeleteUserRequest") + .setPakkage("com.google.showcase.v1beta1") + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("Empty").setPakkage("com.google.protobuf").build()); + List> methodSignatures = + Arrays.asList( + Arrays.asList( + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("name").setType(TypeNode.STRING).build()) + .build())); + Method unaryMethod = + Method.builder() + .setName("delete") + .setMethodSignatures(methodSignatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, clientType, methodSignatures.get(0), resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String name = \"name3373707\";\n", + " echoClient.delete(name);\n", + "}"); + Assert.assertEquals(results, expected); + } +} diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 45cfef387a..3750febf6c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -144,6 +144,14 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   EchoResponse response = echoClient.echo();
+   * }
+   * }
+ * * @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 */ @@ -154,6 +162,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   ResourceName parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(parent);
+   * }
+   * }
+ * * @param parent * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -165,6 +182,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   Status error = Status.newBuilder().build();
+   *   EchoResponse response = echoClient.echo(error);
+   * }
+   * }
+ * * @param error * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -175,6 +201,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   FoobarName name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -186,6 +221,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String content = "content951530617";
+   *   EchoResponse response = echoClient.echo(content);
+   * }
+   * }
+ * * @param content * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -196,6 +240,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
+   *   EchoResponse response = echoClient.echo(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -206,6 +259,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
+   *   EchoResponse response = echoClient.echo(parent);
+   * }
+   * }
+ * * @param parent * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -216,6 +278,16 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String content = "content951530617";
+   *   Severity severity = Severity.forNumber(0);
+   *   EchoResponse response = echoClient.echo(content, severity);
+   * }
+   * }
+ * * @param content * @param severity * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden index db54847763..4ea2ee3319 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden @@ -124,6 +124,17 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String parent = UserName.of("[USER]").toString();
+   *   String displayName = "displayName1714148973";
+   *   String email = "email96619420";
+   *   User response = identityClient.createUser(parent, displayName, email);
+   * }
+   * }
+ * * @param parent * @param display_name * @param email @@ -141,6 +152,23 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String parent = UserName.of("[USER]").toString();
+   *   String displayName = "displayName1714148973";
+   *   String email = "email96619420";
+   *   int age = 96511;
+   *   String nickname = "nickname70690926";
+   *   boolean enableNotifications = true;
+   *   double heightFeet = -1032737338;
+   *   User response =
+   *       identityClient.createUser(
+   *           parent, displayName, email, age, nickname, enableNotifications, heightFeet);
+   * }
+   * }
+ * * @param parent * @param display_name * @param email @@ -188,6 +216,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   UserName name = UserName.of("[USER]");
+   *   User response = identityClient.getUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -199,6 +236,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String name = UserName.of("[USER]").toString();
+   *   User response = identityClient.getUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -239,6 +285,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   UserName name = UserName.of("[USER]");
+   *   identityClient.deleteUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -250,6 +305,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String name = UserName.of("[USER]").toString();
+   *   identityClient.deleteUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index 2ade6c30d5..b9ccab0f57 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -245,6 +245,15 @@ public final BatchGetAssetsHistoryResponse batchGetAssetsHistory( /** * Creates a feed in a parent project/folder/organization to listen to its asset updates. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String parent = "parent-995424086";
+   *   Feed response = assetServiceClient.createFeed(parent);
+   * }
+   * }
+ * * @param parent Required. The name of the project/folder/organization where this feed should be * created in. It can only be an organization number (such as "organizations/123"), a folder * number (such as "folders/123"), a project ID (such as "projects/my-project-id")", or a @@ -281,6 +290,15 @@ public final UnaryCallable createFeedCallable() { /** * Gets details about an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   Feed response = assetServiceClient.getFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the Feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -296,6 +314,15 @@ public final Feed getFeed(FeedName name) { /** * Gets details about an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString();
+   *   Feed response = assetServiceClient.getFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the Feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -331,6 +358,15 @@ public final UnaryCallable getFeedCallable() { /** * Lists all asset feeds in a parent project/folder/organization. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String parent = "parent-995424086";
+   *   ListFeedsResponse response = assetServiceClient.listFeeds(parent);
+   * }
+   * }
+ * * @param parent Required. The parent project/folder/organization whose feeds are to be listed. It * can only be using project/folder/organization number (such as "folders/12345")", or a * project ID (such as "projects/my-project-id"). @@ -366,6 +402,15 @@ public final UnaryCallable listFeedsCallabl /** * Updates an asset feed configuration. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   Feed feed = Feed.newBuilder().build();
+   *   Feed response = assetServiceClient.updateFeed(feed);
+   * }
+   * }
+ * * @param feed Required. The new values of feed details. It must match an existing feed and the * field `name` must be in the format of: projects/project_number/feeds/feed_id or * folders/folder_number/feeds/feed_id or organizations/organization_number/feeds/feed_id. @@ -401,6 +446,15 @@ public final UnaryCallable updateFeedCallable() { /** * Deletes an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   assetServiceClient.deleteFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -416,6 +470,15 @@ public final void deleteFeed(FeedName name) { /** * Deletes an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString();
+   *   assetServiceClient.deleteFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id diff --git a/test/integration/goldens/library/LibraryServiceClient.java b/test/integration/goldens/library/LibraryServiceClient.java index 033e0b3b3d..a87ec39ef7 100644 --- a/test/integration/goldens/library/LibraryServiceClient.java +++ b/test/integration/goldens/library/LibraryServiceClient.java @@ -170,6 +170,15 @@ public LibraryServiceStub getStub() { /** * Creates a shelf, and returns the new Shelf. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   Shelf shelf = Shelf.newBuilder().build();
+   *   Shelf response = libraryServiceClient.createShelf(shelf);
+   * }
+   * }
+ * * @param shelf The shelf to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -203,6 +212,15 @@ public final UnaryCallable createShelfCallable() { /** * Gets a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.getShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -216,6 +234,15 @@ public final Shelf getShelf(ShelfName name) { /** * Gets a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Shelf response = libraryServiceClient.getShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -284,6 +311,15 @@ public final UnaryCallable listShelvesC /** * Deletes a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   libraryServiceClient.deleteShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to delete. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -297,6 +333,15 @@ public final void deleteShelf(ShelfName name) { /** * Deletes a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   libraryServiceClient.deleteShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to delete. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -335,6 +380,16 @@ public final UnaryCallable deleteShelfCallable() { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -357,6 +412,16 @@ public final Shelf mergeShelves(ShelfName name, ShelfName otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   String otherShelfName = "otherShelfName-1942963547";
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -379,6 +444,16 @@ public final Shelf mergeShelves(ShelfName name, String otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -401,6 +476,16 @@ public final Shelf mergeShelves(String name, ShelfName otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   String otherShelfName = "otherShelfName-1942963547";
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -446,6 +531,16 @@ public final UnaryCallable mergeShelvesCallable() { /** * Creates a book, and returns the new Book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.createBook(name, book);
+   * }
+   * }
+ * * @param name The name of the shelf in which the book is created. * @param book The book to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -463,6 +558,16 @@ public final Book createBook(ShelfName name, Book book) { /** * Creates a book, and returns the new Book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.createBook(name, book);
+   * }
+   * }
+ * * @param name The name of the shelf in which the book is created. * @param book The book to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -497,6 +602,15 @@ public final UnaryCallable createBookCallable() { /** * Gets a book. Returns NOT_FOUND if the book does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   Book response = libraryServiceClient.getBook(name);
+   * }
+   * }
+ * * @param name The name of the book to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -510,6 +624,15 @@ public final Book getBook(BookName name) { /** * Gets a book. Returns NOT_FOUND if the book does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Book response = libraryServiceClient.getBook(name);
+   * }
+   * }
+ * * @param name The name of the book to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -631,6 +754,15 @@ public final UnaryCallable deleteBookCallable() { * Updates a book. Returns INVALID_ARGUMENT if the name of the book is non-empty and does not * equal the existing name. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.updateBook(book);
+   * }
+   * }
+ * * @param book The book to update with. The name must match or be empty. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -667,6 +799,16 @@ public final UnaryCallable updateBookCallable() { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -685,6 +827,16 @@ public final Book moveBook(BookName name, ShelfName otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   String otherShelfName = "otherShelfName-1942963547";
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -703,6 +855,16 @@ public final Book moveBook(BookName name, String otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -721,6 +883,16 @@ public final Book moveBook(String name, ShelfName otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   String otherShelfName = "otherShelfName-1942963547";
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index 507ea5ed4a..3ced45d449 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -475,6 +475,15 @@ public final UnaryCallable listSinksCallabl /** * Gets a sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink response = configClient.getSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The resource name of the sink: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" * "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]" @@ -495,6 +504,15 @@ public final LogSink getSink(LogSinkName sinkName) { /** * Gets a sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   LogSink response = configClient.getSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The resource name of the sink: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" * "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]" @@ -536,6 +554,16 @@ public final UnaryCallable getSinkCallable() { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -560,6 +588,16 @@ public final LogSink createSink(BillingAccountName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -584,6 +622,16 @@ public final LogSink createSink(FolderName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -608,6 +656,16 @@ public final LogSink createSink(OrganizationName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -632,6 +690,16 @@ public final LogSink createSink(ProjectName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -681,6 +749,16 @@ public final UnaryCallable createSinkCallable() { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -709,6 +787,16 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink) { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -734,6 +822,17 @@ public final LogSink updateSink(String sinkName, LogSink sink) { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -772,6 +871,17 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink, FieldMask up *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -836,6 +946,15 @@ public final UnaryCallable updateSinkCallable() { * Deletes a sink. If the sink has a unique `writer_identity`, then that service account is also * deleted. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   configClient.deleteSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to delete, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -858,6 +977,15 @@ public final void deleteSink(LogSinkName sinkName) { * Deletes a sink. If the sink has a unique `writer_identity`, then that service account is also * deleted. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   configClient.deleteSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to delete, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -1014,6 +1142,15 @@ public final ListExclusionsPagedResponse listExclusions(ListExclusionsRequest re /** * Gets the description of an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   LogExclusion response = configClient.getExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1032,6 +1169,15 @@ public final LogExclusion getExclusion(LogExclusionName name) { /** * Gets the description of an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   LogExclusion response = configClient.getExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1071,6 +1217,16 @@ public final UnaryCallable getExclusionCallab * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1093,6 +1249,16 @@ public final LogExclusion createExclusion(BillingAccountName parent, LogExclusio * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1115,6 +1281,16 @@ public final LogExclusion createExclusion(FolderName parent, LogExclusion exclus * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1137,6 +1313,16 @@ public final LogExclusion createExclusion(OrganizationName parent, LogExclusion * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1159,6 +1345,17 @@ public final LogExclusion createExclusion(ProjectName parent, LogExclusion exclu * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent =
+   *       LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1200,6 +1397,17 @@ public final UnaryCallable createExclusion /** * Changes one or more properties of an existing exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
+   * }
+   * }
+ * * @param name Required. The resource name of the exclusion to update: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1231,6 +1439,17 @@ public final LogExclusion updateExclusion( /** * Changes one or more properties of an existing exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
+   * }
+   * }
+ * * @param name Required. The resource name of the exclusion to update: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1283,6 +1502,15 @@ public final UnaryCallable updateExclusion /** * Deletes an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   configClient.deleteExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion to delete: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1301,6 +1529,15 @@ public final void deleteExclusion(LogExclusionName name) { /** * Deletes an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   configClient.deleteExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion to delete: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java index 2b7cef1ad5..b9f4814950 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -163,6 +163,15 @@ public LoggingServiceV2Stub getStub() { * written shortly before the delete operation might not be deleted. Entries received after the * delete operation with a timestamp before the operation will be deleted. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   loggingClient.deleteLog(logName);
+   * }
+   * }
+ * * @param log_name Required. The resource name of the log to delete: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]" "folders/[FOLDER_ID]/logs/[LOG_ID]" @@ -185,6 +194,15 @@ public final void deleteLog(LogName logName) { * written shortly before the delete operation might not be deleted. Entries received after the * delete operation with a timestamp before the operation will be deleted. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   String logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]").toString();
+   *   loggingClient.deleteLog(logName);
+   * }
+   * }
+ * * @param log_name Required. The resource name of the log to delete: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]" "folders/[FOLDER_ID]/logs/[LOG_ID]" @@ -230,6 +248,19 @@ public final UnaryCallable deleteLogCallable() { * libraries configured to use Logging. A single request may contain log entries for a maximum of * 1000 different resources (projects, organizations, billing accounts or folders) * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   MonitoredResource resource = MonitoredResource.newBuilder().build();
+   *   Map labels = new HashMap<>();
+   *   List entries = new ArrayList<>();
+   *   WriteLogEntriesResponse response =
+   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
+   * }
+   * }
+ * * @param log_name Optional. A default log resource name that is assigned to all log entries in * `entries` that do not specify a value for `log_name`: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" @@ -292,6 +323,19 @@ public final WriteLogEntriesResponse writeLogEntries( * libraries configured to use Logging. A single request may contain log entries for a maximum of * 1000 different resources (projects, organizations, billing accounts or folders) * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   String logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]").toString();
+   *   MonitoredResource resource = MonitoredResource.newBuilder().build();
+   *   Map labels = new HashMap<>();
+   *   List entries = new ArrayList<>();
+   *   WriteLogEntriesResponse response =
+   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
+   * }
+   * }
+ * * @param log_name Optional. A default log resource name that is assigned to all log entries in * `entries` that do not specify a value for `log_name`: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java index a7a58f48b8..7ae9d336af 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -214,6 +214,15 @@ public final ListLogMetricsPagedResponse listLogMetrics(ListLogMetricsRequest re /** * Gets a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   LogMetric response = metricsClient.getLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the desired metric: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -230,6 +239,15 @@ public final LogMetric getLogMetric(LogMetricName metricName) { /** * Gets a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   LogMetric response = metricsClient.getLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the desired metric: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -265,6 +283,16 @@ public final UnaryCallable getLogMetricCallable( /** * Creates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
+   * }
+   * }
+ * * @param parent Required. The resource name of the project in which to create the metric: *

"projects/[PROJECT_ID]" *

The new metric must be provided in the request. @@ -285,6 +313,16 @@ public final LogMetric createLogMetric(ProjectName parent, LogMetric metric) { /** * Creates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String parent = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
+   * }
+   * }
+ * * @param parent Required. The resource name of the project in which to create the metric: *

"projects/[PROJECT_ID]" *

The new metric must be provided in the request. @@ -323,6 +361,16 @@ public final UnaryCallable createLogMetricCal /** * Creates or updates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to update: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" *

The updated metric must be provided in the request and it's `name` field must be the @@ -344,6 +392,16 @@ public final LogMetric updateLogMetric(LogMetricName metricName, LogMetric metri /** * Creates or updates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to update: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" *

The updated metric must be provided in the request and it's `name` field must be the @@ -383,6 +441,15 @@ public final UnaryCallable updateLogMetricCal /** * Deletes a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   metricsClient.deleteLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to delete: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -399,6 +466,15 @@ public final void deleteLogMetric(LogMetricName metricName) { /** * Deletes a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   metricsClient.deleteLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to delete: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index d58b981828..0aa0479a15 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -290,6 +290,15 @@ public final UnaryCallable listInst /** * Gets the details of a specific Redis instance. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   Instance response = cloudRedisClient.getInstance(name);
+   * }
+   * }
+ * * @param name Required. Redis instance resource name using the form: * `projects/{project_id}/locations/{location_id}/instances/{instance_id}` where `location_id` * refers to a GCP region. @@ -305,6 +314,15 @@ public final Instance getInstance(InstanceName name) { /** * Gets the details of a specific Redis instance. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   String name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]").toString();
+   *   Instance response = cloudRedisClient.getInstance(name);
+   * }
+   * }
+ * * @param name Required. Redis instance resource name using the form: * `projects/{project_id}/locations/{location_id}/instances/{instance_id}` where `location_id` * refers to a GCP region. From aeac127daaa050581cf448604582537014ad7168 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 13:32:59 -0800 Subject: [PATCH 03/32] Add resource name into ClassComposer interface --- .../gapic/composer/ClassComposer.java | 6 +++- .../generator/gapic/composer/Composer.java | 31 ++++++++++++------- ...pcServiceCallableFactoryClassComposer.java | 4 ++- .../GrpcServiceStubClassComposer.java | 4 ++- .../composer/MockServiceClassComposer.java | 4 ++- .../MockServiceImplClassComposer.java | 4 ++- .../composer/ServiceClientClassComposer.java | 4 ++- .../ServiceSettingsClassComposer.java | 4 ++- .../composer/ServiceStubClassComposer.java | 4 ++- ...rviceCallableFactoryClassComposerTest.java | 3 +- .../GrpcServiceStubClassComposerTest.java | 9 ++++-- .../MockServiceClassComposerTest.java | 3 +- .../MockServiceImplClassComposerTest.java | 3 +- .../ServiceClientClassComposerTest.java | 6 ++-- .../ServiceSettingsClassComposerTest.java | 3 +- .../ServiceStubClassComposerTest.java | 3 +- 16 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java index 131020c562..de7a1cccc8 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java @@ -16,9 +16,13 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.Message; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import java.util.Map; public interface ClassComposer { - GapicClass generate(Service service, Map messageTypes); + // TODO(b/174257081): Clean up the hierarchy to avoid pass another parameter (resourceNames is + // only used for composing sample code). + GapicClass generate( + Service service, Map messageTypes, Map resourceNames); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 02e1dc9bcc..733a50c860 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -60,8 +60,8 @@ public static List generateServiceClasses( @Nonnull Map resourceNames, @Nonnull Map messageTypes) { List clazzes = new ArrayList<>(); - clazzes.addAll(generateStubClasses(service, serviceConfig, messageTypes)); - clazzes.addAll(generateClientSettingsClasses(service, messageTypes)); + clazzes.addAll(generateStubClasses(service, serviceConfig, messageTypes, resourceNames)); + clazzes.addAll(generateClientSettingsClasses(service, messageTypes, resourceNames)); clazzes.addAll(generateMocksAndTestClasses(service, resourceNames, messageTypes)); // TODO(miraleung): Generate test classes. return clazzes; @@ -76,29 +76,38 @@ public static List generateResourceNameHelperClasses( } public static List generateStubClasses( - Service service, GapicServiceConfig serviceConfig, Map messageTypes) { + Service service, + GapicServiceConfig serviceConfig, + Map messageTypes, + Map resourceNames) { List clazzes = new ArrayList<>(); - clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes)); + clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames)); clazzes.add( ServiceStubSettingsClassComposer.instance().generate(service, serviceConfig, messageTypes)); - clazzes.add(GrpcServiceCallableFactoryClassComposer.instance().generate(service, messageTypes)); - clazzes.add(GrpcServiceStubClassComposer.instance().generate(service, messageTypes)); + clazzes.add( + GrpcServiceCallableFactoryClassComposer.instance() + .generate(service, messageTypes, resourceNames)); + clazzes.add( + GrpcServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames)); return clazzes; } public static List generateClientSettingsClasses( - Service service, Map messageTypes) { + Service service, Map messageTypes, Map resourceNames) { List clazzes = new ArrayList<>(); - clazzes.add(ServiceClientClassComposer.instance().generate(service, messageTypes)); - clazzes.add(ServiceSettingsClassComposer.instance().generate(service, messageTypes)); + clazzes.add( + ServiceClientClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add( + ServiceSettingsClassComposer.instance().generate(service, messageTypes, resourceNames)); return clazzes; } public static List generateMocksAndTestClasses( Service service, Map resourceNames, Map messageTypes) { List clazzes = new ArrayList<>(); - clazzes.add(MockServiceClassComposer.instance().generate(service, messageTypes)); - clazzes.add(MockServiceImplClassComposer.instance().generate(service, messageTypes)); + clazzes.add(MockServiceClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add( + MockServiceImplClassComposer.instance().generate(service, messageTypes, resourceNames)); clazzes.add( ServiceClientTestClassComposer.instance().generate(service, resourceNames, messageTypes)); return clazzes; diff --git a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java index 5d1f054e2f..49a5e19cfb 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java @@ -42,6 +42,7 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.common.base.Preconditions; import com.google.longrunning.Operation; @@ -64,7 +65,8 @@ public static GrpcServiceCallableFactoryClassComposer instance() { } @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, Map ignore, Map resourceNames) { Map types = createTypes(service); String className = String.format("Grpc%sCallableFactory", service.name()); GapicClass.Kind kind = Kind.STUB; diff --git a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java index a8628a4131..68bd03360a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java @@ -51,6 +51,7 @@ import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; @@ -112,7 +113,8 @@ public static GrpcServiceStubClassComposer instance() { } @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, Map ignore, Map resourceNames) { String pakkage = service.pakkage() + ".stub"; Map types = createDynamicTypes(service, pakkage); String className = getThisClassName(service.name()); diff --git a/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java index 5e1a5057f5..b1883b3719 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java @@ -33,6 +33,7 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.protobuf.AbstractMessage; import io.grpc.ServerServiceDefinition; @@ -55,7 +56,8 @@ public static MockServiceClassComposer instance() { } @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, Map ignore, Map resourceNames) { Map types = createTypes(service); String className = String.format(MOCK_SERVICE_NAME_PATTERN, service.name()); GapicClass.Kind kind = Kind.TEST; diff --git a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java index 3b74d03478..a60e0d2b07 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java @@ -42,6 +42,7 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.longrunning.Operation; @@ -94,7 +95,8 @@ public static MockServiceImplClassComposer instance() { } @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, Map ignore, Map resourceNames) { Map types = createDynamicTypes(service); String className = String.format(MOCK_SERVICE_IMPL_NAME_PATTERN, service.name()); GapicClass.Kind kind = Kind.TEST; diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index e6fec42bd9..73f070e88b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -62,6 +62,7 @@ import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.annotations.VisibleForTesting; @@ -109,7 +110,8 @@ public static ServiceClientClassComposer instance() { } @Override - public GapicClass generate(Service service, Map messageTypes) { + public GapicClass generate( + Service service, Map messageTypes, Map resourceNames) { Map types = createTypes(service, messageTypes); String className = getClientClassName(service); GapicClass.Kind kind = Kind.MAIN; diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java index 7e8aec2b25..0026f4863e 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java @@ -54,6 +54,7 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; @@ -92,7 +93,8 @@ public static ServiceSettingsClassComposer instance() { } @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, Map ignore, Map resourceNames) { String pakkage = service.pakkage(); Map types = createDynamicTypes(service); String className = getThisClassName(service); diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java index fd6fb17e34..2127f2499e 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java @@ -35,6 +35,7 @@ import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.longrunning.Operation; @@ -57,7 +58,8 @@ public static ServiceStubClassComposer instance() { } @Override - public GapicClass generate(Service service, Map messageTypes) { + public GapicClass generate( + Service service, Map messageTypes, Map resourceNames) { Map types = createTypes(service, messageTypes); String className = String.format("%sStub", service.name()); GapicClass.Kind kind = Kind.STUB; diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java index bc1f8d0c09..a243f298d4 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java @@ -59,7 +59,8 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - GrpcServiceCallableFactoryClassComposer.instance().generate(echoProtoService, messageTypes); + GrpcServiceCallableFactoryClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java index 47c7767d45..20f3e7bb1b 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java @@ -55,7 +55,8 @@ public void generateGrpcServiceStubClass_simple() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); GapicClass clazz = - GrpcServiceStubClassComposer.instance().generate(echoProtoService, messageTypes); + GrpcServiceStubClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -82,7 +83,8 @@ public void generateGrpcServiceStubClass_httpBindings() { outputResourceNames); Service testingProtoService = services.get(0); GapicClass clazz = - GrpcServiceStubClassComposer.instance().generate(testingProtoService, messageTypes); + GrpcServiceStubClassComposer.instance() + .generate(testingProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -115,7 +117,8 @@ public void generateGrpcServiceStubClass_httpBindingsWithSubMessageFields() { outputResourceNames); Service service = services.get(0); - GapicClass clazz = GrpcServiceStubClassComposer.instance().generate(service, messageTypes); + GapicClass clazz = + GrpcServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java index 61785acb7b..f1c8688b15 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java @@ -58,7 +58,8 @@ public void generateServiceClasses() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); - GapicClass clazz = MockServiceClassComposer.instance().generate(echoProtoService, messageTypes); + GapicClass clazz = + MockServiceClassComposer.instance().generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java index 624126bb96..b624f54c99 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java @@ -59,7 +59,8 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - MockServiceImplClassComposer.instance().generate(echoProtoService, messageTypes); + MockServiceImplClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 1a882a6a30..a45784aaa2 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -53,7 +53,8 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - ServiceClientClassComposer.instance().generate(echoProtoService, messageTypes); + ServiceClientClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -76,7 +77,8 @@ public void generateServiceClasses_methodSignatureHasNestedFields() { fileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service protoService = services.get(0); - GapicClass clazz = ServiceClientClassComposer.instance().generate(protoService, messageTypes); + GapicClass clazz = + ServiceClientClassComposer.instance().generate(protoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java index bd7b41eb16..e87d2fffc1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java @@ -59,7 +59,8 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - ServiceSettingsClassComposer.instance().generate(echoProtoService, messageTypes); + ServiceSettingsClassComposer.instance() + .generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java index 2e7a390b0b..81ed0da6d8 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java @@ -58,7 +58,8 @@ public void generateServiceClasses() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); - GapicClass clazz = ServiceStubClassComposer.instance().generate(echoProtoService, messageTypes); + GapicClass clazz = + ServiceStubClassComposer.instance().generate(echoProtoService, messageTypes, resourceNames); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); From 1caf9d9b07e332cb4f67a8fe53daf692ad2ac2c6 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 15:14:38 -0800 Subject: [PATCH 04/32] Remove resource name from class composer interface --- .../generator/gapic/composer/ClassComposer.java | 6 +----- .../api/generator/gapic/composer/Composer.java | 17 ++++++----------- ...GrpcServiceCallableFactoryClassComposer.java | 4 +--- .../composer/GrpcServiceStubClassComposer.java | 4 +--- .../composer/MockServiceClassComposer.java | 4 +--- .../composer/MockServiceImplClassComposer.java | 4 +--- .../composer/ServiceClientClassComposer.java | 5 +++-- .../composer/ServiceSettingsClassComposer.java | 4 +--- .../composer/ServiceStubClassComposer.java | 4 +--- ...ServiceCallableFactoryClassComposerTest.java | 3 +-- .../GrpcServiceStubClassComposerTest.java | 9 +++------ .../composer/MockServiceClassComposerTest.java | 3 +-- .../MockServiceImplClassComposerTest.java | 3 +-- .../ServiceSettingsClassComposerTest.java | 3 +-- .../composer/ServiceStubClassComposerTest.java | 3 +-- 15 files changed, 24 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java index de7a1cccc8..131020c562 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ClassComposer.java @@ -16,13 +16,9 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.Message; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import java.util.Map; public interface ClassComposer { - // TODO(b/174257081): Clean up the hierarchy to avoid pass another parameter (resourceNames is - // only used for composing sample code). - GapicClass generate( - Service service, Map messageTypes, Map resourceNames); + GapicClass generate(Service service, Map messageTypes); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 733a50c860..adf5f03432 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -81,14 +81,11 @@ public static List generateStubClasses( Map messageTypes, Map resourceNames) { List clazzes = new ArrayList<>(); - clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes)); clazzes.add( ServiceStubSettingsClassComposer.instance().generate(service, serviceConfig, messageTypes)); - clazzes.add( - GrpcServiceCallableFactoryClassComposer.instance() - .generate(service, messageTypes, resourceNames)); - clazzes.add( - GrpcServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add(GrpcServiceCallableFactoryClassComposer.instance().generate(service, messageTypes)); + clazzes.add(GrpcServiceStubClassComposer.instance().generate(service, messageTypes)); return clazzes; } @@ -97,17 +94,15 @@ public static List generateClientSettingsClasses( List clazzes = new ArrayList<>(); clazzes.add( ServiceClientClassComposer.instance().generate(service, messageTypes, resourceNames)); - clazzes.add( - ServiceSettingsClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add(ServiceSettingsClassComposer.instance().generate(service, messageTypes)); return clazzes; } public static List generateMocksAndTestClasses( Service service, Map resourceNames, Map messageTypes) { List clazzes = new ArrayList<>(); - clazzes.add(MockServiceClassComposer.instance().generate(service, messageTypes, resourceNames)); - clazzes.add( - MockServiceImplClassComposer.instance().generate(service, messageTypes, resourceNames)); + clazzes.add(MockServiceClassComposer.instance().generate(service, messageTypes)); + clazzes.add(MockServiceImplClassComposer.instance().generate(service, messageTypes)); clazzes.add( ServiceClientTestClassComposer.instance().generate(service, resourceNames, messageTypes)); return clazzes; diff --git a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java index 49a5e19cfb..5d1f054e2f 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java @@ -42,7 +42,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.Message; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.common.base.Preconditions; import com.google.longrunning.Operation; @@ -65,8 +64,7 @@ public static GrpcServiceCallableFactoryClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map ignore, Map resourceNames) { + public GapicClass generate(Service service, Map ignore) { Map types = createTypes(service); String className = String.format("Grpc%sCallableFactory", service.name()); GapicClass.Kind kind = Kind.STUB; diff --git a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java index 68bd03360a..a8628a4131 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java @@ -51,7 +51,6 @@ import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; @@ -113,8 +112,7 @@ public static GrpcServiceStubClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map ignore, Map resourceNames) { + public GapicClass generate(Service service, Map ignore) { String pakkage = service.pakkage() + ".stub"; Map types = createDynamicTypes(service, pakkage); String className = getThisClassName(service.name()); diff --git a/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java index b1883b3719..5e1a5057f5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MockServiceClassComposer.java @@ -33,7 +33,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.Message; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.protobuf.AbstractMessage; import io.grpc.ServerServiceDefinition; @@ -56,8 +55,7 @@ public static MockServiceClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map ignore, Map resourceNames) { + public GapicClass generate(Service service, Map ignore) { Map types = createTypes(service); String className = String.format(MOCK_SERVICE_NAME_PATTERN, service.name()); GapicClass.Kind kind = Kind.TEST; diff --git a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java index a60e0d2b07..3b74d03478 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposer.java @@ -42,7 +42,6 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.longrunning.Operation; @@ -95,8 +94,7 @@ public static MockServiceImplClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map ignore, Map resourceNames) { + public GapicClass generate(Service service, Map ignore) { Map types = createDynamicTypes(service); String className = String.format(MOCK_SERVICE_IMPL_NAME_PATTERN, service.name()); GapicClass.Kind kind = Kind.TEST; diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 73f070e88b..a184afb391 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -85,7 +85,7 @@ import java.util.stream.Collectors; import javax.annotation.Generated; -public class ServiceClientClassComposer implements ClassComposer { +public class ServiceClientClassComposer { private static final ServiceClientClassComposer INSTANCE = new ServiceClientClassComposer(); private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; private static final String CALLABLE_NAME_PATTERN = "%sCallable"; @@ -109,9 +109,10 @@ public static ServiceClientClassComposer instance() { return INSTANCE; } - @Override public GapicClass generate( Service service, Map messageTypes, Map resourceNames) { + // TODO(miraleung): Clean up the hierarchy to avoid pass another parameter (resourceNames is + // only used for composing sample code). See b/174257081. Map types = createTypes(service, messageTypes); String className = getClientClassName(service); GapicClass.Kind kind = Kind.MAIN; diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java index 0026f4863e..7e8aec2b25 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java @@ -54,7 +54,6 @@ import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Method.Stream; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.common.base.Preconditions; @@ -93,8 +92,7 @@ public static ServiceSettingsClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map ignore, Map resourceNames) { + public GapicClass generate(Service service, Map ignore) { String pakkage = service.pakkage(); Map types = createDynamicTypes(service); String className = getThisClassName(service); diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java index 2127f2499e..fd6fb17e34 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubClassComposer.java @@ -35,7 +35,6 @@ import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.JavaStyle; import com.google.longrunning.Operation; @@ -58,8 +57,7 @@ public static ServiceStubClassComposer instance() { } @Override - public GapicClass generate( - Service service, Map messageTypes, Map resourceNames) { + public GapicClass generate(Service service, Map messageTypes) { Map types = createTypes(service, messageTypes); String className = String.format("%sStub", service.name()); GapicClass.Kind kind = Kind.STUB; diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java index a243f298d4..bc1f8d0c09 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposerTest.java @@ -59,8 +59,7 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - GrpcServiceCallableFactoryClassComposer.instance() - .generate(echoProtoService, messageTypes, resourceNames); + GrpcServiceCallableFactoryClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java index 20f3e7bb1b..47c7767d45 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposerTest.java @@ -55,8 +55,7 @@ public void generateGrpcServiceStubClass_simple() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); GapicClass clazz = - GrpcServiceStubClassComposer.instance() - .generate(echoProtoService, messageTypes, resourceNames); + GrpcServiceStubClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -83,8 +82,7 @@ public void generateGrpcServiceStubClass_httpBindings() { outputResourceNames); Service testingProtoService = services.get(0); GapicClass clazz = - GrpcServiceStubClassComposer.instance() - .generate(testingProtoService, messageTypes, resourceNames); + GrpcServiceStubClassComposer.instance().generate(testingProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); @@ -117,8 +115,7 @@ public void generateGrpcServiceStubClass_httpBindingsWithSubMessageFields() { outputResourceNames); Service service = services.get(0); - GapicClass clazz = - GrpcServiceStubClassComposer.instance().generate(service, messageTypes, resourceNames); + GapicClass clazz = GrpcServiceStubClassComposer.instance().generate(service, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java index f1c8688b15..61785acb7b 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceClassComposerTest.java @@ -58,8 +58,7 @@ public void generateServiceClasses() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); - GapicClass clazz = - MockServiceClassComposer.instance().generate(echoProtoService, messageTypes, resourceNames); + GapicClass clazz = MockServiceClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java index b624f54c99..624126bb96 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MockServiceImplClassComposerTest.java @@ -59,8 +59,7 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - MockServiceImplClassComposer.instance() - .generate(echoProtoService, messageTypes, resourceNames); + MockServiceImplClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java index e87d2fffc1..bd7b41eb16 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposerTest.java @@ -59,8 +59,7 @@ public void generateServiceClasses() { Service echoProtoService = services.get(0); GapicClass clazz = - ServiceSettingsClassComposer.instance() - .generate(echoProtoService, messageTypes, resourceNames); + ServiceSettingsClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java index 81ed0da6d8..2e7a390b0b 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubClassComposerTest.java @@ -58,8 +58,7 @@ public void generateServiceClasses() { echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames); Service echoProtoService = services.get(0); - GapicClass clazz = - ServiceStubClassComposer.instance().generate(echoProtoService, messageTypes, resourceNames); + GapicClass clazz = ServiceStubClassComposer.instance().generate(echoProtoService, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); From 6337c0734fc7c2490e4f3c84a3c4056e0ebb4898 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 17:32:30 -0800 Subject: [PATCH 05/32] Remove bug ticket --- .../generator/gapic/composer/ServiceClientClassComposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index a184afb391..cdbcbc926a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -112,7 +112,7 @@ public static ServiceClientClassComposer instance() { public GapicClass generate( Service service, Map messageTypes, Map resourceNames) { // TODO(miraleung): Clean up the hierarchy to avoid pass another parameter (resourceNames is - // only used for composing sample code). See b/174257081. + // only used for composing sample code). Map types = createTypes(service, messageTypes); String className = getClientClassName(service); GapicClass.Kind kind = Kind.MAIN; From 42beeac85e30fe7a75c1b83c12b2dcc0e4655f89 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 09:48:30 -0800 Subject: [PATCH 06/32] move todo --- .../generator/gapic/composer/ServiceClientClassComposer.java | 2 -- .../java/com/google/api/generator/gapic/model/GapicClass.java | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index cdbcbc926a..91d3f74e47 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -111,8 +111,6 @@ public static ServiceClientClassComposer instance() { public GapicClass generate( Service service, Map messageTypes, Map resourceNames) { - // TODO(miraleung): Clean up the hierarchy to avoid pass another parameter (resourceNames is - // only used for composing sample code). Map types = createTypes(service, messageTypes); String className = getClientClassName(service); GapicClass.Kind kind = Kind.MAIN; diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java index 8ae0376efc..55d538ae60 100644 --- a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java +++ b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java @@ -19,6 +19,8 @@ @AutoValue public abstract class GapicClass { + // TODO(miraleung): Clean up the hierarchy to avoid pass another parameter (resourceNames is + // only used for composing sample code). // TODO(miraleung): Add enum for resource name classes. public enum Kind { MAIN, From de9e8272eb37458f530439c266f0a37f5ef195bc Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 17:21:08 -0800 Subject: [PATCH 07/32] Implement Pure Unary RPC sample code --- .../MethodSampleCodeHelperComposer.java | 167 +++++++ .../composer/ServiceClientClassComposer.java | 32 +- .../ServiceClientCommentComposer.java | 11 +- .../ServiceClientSampleCodeComposer.java | 23 + .../api/generator/gapic/composer/BUILD.bazel | 2 + .../MethodSampleCodeHelperComposerTest.java | 454 ++++++++++++++++++ .../gapic/composer/goldens/EchoClient.golden | 64 +++ .../composer/goldens/IdentityClient.golden | 64 +++ .../goldens/asset/AssetServiceClient.java | 63 +++ .../goldens/library/LibraryServiceClient.java | 172 +++++++ .../goldens/logging/ConfigClient.java | 236 +++++++++ .../goldens/logging/LoggingClient.java | 44 ++ .../goldens/logging/MetricsClient.java | 76 +++ .../goldens/redis/CloudRedisClient.java | 18 + 14 files changed, 1416 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java create mode 100644 src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java new file mode 100644 index 0000000000..ec2e4e9c19 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java @@ -0,0 +1,167 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer; + +import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.Expr; +import com.google.api.generator.engine.ast.ExprStatement; +import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.TryCatchStatement; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.Variable; +import com.google.api.generator.engine.ast.VariableExpr; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.utils.JavaStyle; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class MethodSampleCodeHelperComposer { + private static String RESPONSE = "response"; + + public static TryCatchStatement composeUnaryRpcMethodSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames) { + VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); + // Assign each method arguments with its default value. + Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); + List methodArgumentsAssignmentExpr = + assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); + List methodVarExprs = + arguments.stream() + .map(arg -> methodArgVarExprMap.get(arg.name())) + .collect(Collectors.toList()); + // Invoke current method based on return type. + // e.g. if return void, echoClient.echo(..); or, + // e.g. if return other type, EchoResponse response = echoClient.echo(...); + boolean returnsVoid = isProtoEmptyType(method.outputType()); + Expr responseExpr = null; + if (returnsVoid) { + responseExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments(methodVarExprs) + .setReturnType(clientType) + .build(); + } else { + responseExpr = + createAssignExprForVariableWithClientMethod( + createVariableExpr(RESPONSE, method.outputType()), + clientVarExpr, + JavaStyle.toLowerCamelCase(method.name()), + methodVarExprs); + } + + List bodyExpr = new ArrayList<>(); + bodyExpr.addAll(methodArgumentsAssignmentExpr); + bodyExpr.add(responseExpr); + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody( + bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) + .setIsSampleCode(true) + .build(); + } + + // ==================================Helpers===================================================// + + // Assign client variable expr with create client. + // e.g EchoClient echoClient = EchoClient.create() + private static AssignmentExpr assignClientVariableWithCreateMethodExpr( + VariableExpr clientVarExpr) { + return AssignmentExpr.builder() + .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType(clientVarExpr.variable().type()) + .setReturnType(clientVarExpr.variable().type()) + .setMethodName("create") + .build()) + .build(); + } + + // Create a Map where key is method's argument name, and value is its VariableExpr. + private static Map createMethodArgumentsVariableExprs( + List arguments) { + return arguments.stream() + .collect( + Collectors.toMap( + methodArg -> methodArg.name(), + methodArg -> + createVariableExpr( + JavaStyle.toLowerCamelCase(methodArg.name()), methodArg.type()))); + } + + // Return a list of AssignmentExpr for method argument with its default value. + private static List assignMethodArgumentsWithDefaultValues( + List arguments, + Map argVarExprs, + Map resourceNames) { + return arguments.stream() + .map( + arg -> + createAssignmentExpr( + argVarExprs.get(arg.name()), + DefaultValueComposer.createDefaultValue(arg, resourceNames))) + .collect(Collectors.toList()); + } + + private static Expr createAssignExprForVariableWithClientMethod( + VariableExpr variableExpr, + VariableExpr clientVarExpr, + String methodName, + List argumentsVarExprs) { + MethodInvocationExpr clientMethodInvocationExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(methodName)) + .setArguments(argumentsVarExprs) + .setReturnType(variableExpr.variable().type()) + .build(); + return AssignmentExpr.builder() + .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(clientMethodInvocationExpr) + .build(); + } + + private static String getClientName(TypeNode clientType) { + return JavaStyle.toLowerCamelCase(clientType.reference().name()); + } + + private static boolean isProtoEmptyType(TypeNode type) { + return type.reference().pakkage().equals("com.google.protobuf") + && type.reference().name().equals("Empty"); + } + + private static AssignmentExpr createAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { + return AssignmentExpr.builder() + .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(valueExpr) + .build(); + } + + private static VariableExpr createVariableExpr(String variableName, TypeNode type) { + return VariableExpr.builder() + .setVariable(Variable.builder().setName(variableName).setType(type).build()) + .build(); + } +} diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 91d3f74e47..468d6fe024 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -130,7 +130,8 @@ public GapicClass generate( .setName(className) .setImplementsTypes(createClassImplements(types)) .setStatements(createFieldDeclarations(service, types, hasLroClient)) - .setMethods(createClassMethods(service, messageTypes, types, hasLroClient)) + .setMethods( + createClassMethods(service, messageTypes, types, resourceNames, hasLroClient)) .setNestedClasses(createNestedPagingClasses(service, messageTypes, types)) .build(); return GapicClass.create(kind, classDef); @@ -153,12 +154,13 @@ private static List createClassMethods( Service service, Map messageTypes, Map types, + Map resourceNames, boolean hasLroClient) { List methods = new ArrayList<>(); methods.addAll(createStaticCreatorMethods(service, types)); methods.addAll(createConstructorMethods(service, types, hasLroClient)); methods.addAll(createGetterMethods(service, types, hasLroClient)); - methods.addAll(createServiceMethods(service, messageTypes, types)); + methods.addAll(createServiceMethods(service, messageTypes, types, resourceNames)); methods.addAll(createBackgroundResourceMethods(service, types)); return methods; } @@ -472,11 +474,16 @@ private static List createGetterMethods( } private static List createServiceMethods( - Service service, Map messageTypes, Map types) { + Service service, + Map messageTypes, + Map types, + Map resourceNames) { List javaMethods = new ArrayList<>(); + String clientName = getClientClassName(service); for (Method method : service.methods()) { if (method.stream().equals(Stream.NONE)) { - javaMethods.addAll(createMethodVariants(method, messageTypes, types)); + javaMethods.addAll( + createMethodVariants(method, messageTypes, types, clientName, resourceNames)); javaMethods.add(createMethodDefaultMethod(method, types)); } if (method.hasLro()) { @@ -491,7 +498,11 @@ private static List createServiceMethods( } private static List createMethodVariants( - Method method, Map messageTypes, Map types) { + Method method, + Map messageTypes, + Map types, + String clientName, + Map resourceNames) { List javaMethods = new ArrayList<>(); String methodName = JavaStyle.toLowerCamelCase(method.name()); TypeNode methodInputType = method.inputType(); @@ -553,10 +564,19 @@ private static List createMethodVariants( .setReturnType(methodOutputType) .build(); + String methodSampleCode = ""; + if (!method.isPaged() && !method.hasLro()) { + // TODO(summerji): Remove the condition check once finished the implementation on paged + // sample code and lro sample code. + methodSampleCode = + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, signature, types.get(clientName), resourceNames); + } MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() .setHeaderCommentStatements( - ServiceClientCommentComposer.createRpcMethodHeaderComment(method, signature)) + ServiceClientCommentComposer.createRpcMethodHeaderComment( + method, signature, methodSampleCode)) .setScope(ScopeNode.PUBLIC) .setIsFinal(true) .setName(String.format(method.hasLro() ? "%sAsync" : "%s", methodName)) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java index 09507cd30f..2d512a4ad0 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java @@ -162,7 +162,7 @@ static CommentStatement createCreateMethodStubArgComment( } static List createRpcMethodHeaderComment( - Method method, List methodArguments) { + Method method, List methodArguments, String sampleCode) { JavaDocComment.Builder methodJavadocBuilder = JavaDocComment.builder(); if (method.hasDescription()) { @@ -170,8 +170,10 @@ static List createRpcMethodHeaderComment( processProtobufComment(method.description(), methodJavadocBuilder, null); } - // methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); - // TODO(summerji): Add sample code here and uncomment the above. + if (!sampleCode.isEmpty()) { + methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); + methodJavadocBuilder.addSampleCode(sampleCode); + } if (methodArguments.isEmpty()) { methodJavadocBuilder.addParam( @@ -196,7 +198,8 @@ static List createRpcMethodHeaderComment( } static List createRpcMethodHeaderComment(Method method) { - return createRpcMethodHeaderComment(method, Collections.emptyList()); + // TODO(summerji): Refactor this method when implement default method sample code. + return createRpcMethodHeaderComment(method, Collections.emptyList(), ""); } static CommentStatement createMethodNoArgComment(String serviceName) { diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 98d66d3148..f8b57ea290 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -25,8 +25,14 @@ import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class ServiceClientSampleCodeComposer { // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. @@ -169,4 +175,21 @@ public static String composeClassHeaderEndpointSampleCode( ExprStatement.withExpr(initSettingsVarExpr), ExprStatement.withExpr(initClientVarExpr))); } + + public static String composeRpcMethodHeaderSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames) { + return SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + method, arguments, clientType, resourceNames)); + } + + // ======================================== Helpers ==========================================// + + private static VariableExpr createVariableExpr(String variableName, TypeNode type) { + return VariableExpr.withVariable( + Variable.builder().setName(variableName).setType(type).build()); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index 0e0e941a90..8456ee092f 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -22,6 +22,7 @@ TESTS = UPDATE_GOLDENS_TESTS + [ "DefaultValueComposerTest", "ResourceNameTokenizerTest", "RetrySettingsComposerTest", + "MethodSampleCodeHelperComposerTest", ] TEST_DEPS = [ @@ -38,6 +39,7 @@ TEST_DEPS = [ "//src/main/java/com/google/api/generator/gapic/protoparser", "//src/test/java/com/google/api/generator/gapic/testdata:showcase_java_proto", "//src/test/java/com/google/api/generator/gapic/testdata:testgapic_java_proto", + "@com_google_api_api_common//jar", "@com_google_api_gax_java//gax", "@com_google_googleapis//google/logging/v2:logging_java_proto", "@com_google_googleapis//google/pubsub/v1:pubsub_java_proto", diff --git a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java new file mode 100644 index 0000000000..152152b5bd --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java @@ -0,0 +1,454 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer; + +import static junit.framework.Assert.assertEquals; + +import com.google.api.generator.engine.ast.ConcreteReference; +import com.google.api.generator.engine.ast.Reference; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.VaporReference; +import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Field; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.model.ResourceReference; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class MethodSampleCodeHelperComposerTest { + private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; + private static final TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + Map resourceNames = new HashMap<>(); + + @Before + public void setUp() { + ResourceName foobarResourceName = + ResourceName.builder() + .setVariableName("foobar") + .setPakkage(PACKAGE_NAME) + .setResourceTypeString("showcase.googleapis.com/Foobar") + .setPatterns( + Arrays.asList( + "projects/{project}/foobars/{foobar}", + "projects/{project}/chocolate/variants/{variant}/foobars/{foobar}", + "foobars/{foobar}", + "bar_foo/{bar_foo}/foobars/{foobar}")) + .setParentMessageName("Foobar") + .build(); + ResourceName anythingGoesResourceName = + ResourceName.createWildcard("showcase.googleapis.com/AnythingGoes", PACKAGE_NAME); + resourceNames.put("showcase.googleapis.com/Foobar", foobarResourceName); + resourceNames.put("showcase.googleapis.com/AnythingGoes", anythingGoesResourceName); + } + + @Test + public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode resourceNameType = + TypeNode.withReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(resourceNameType) + .setField( + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withType("showcase.googleapis.com/AnythingGoes")) + .build()) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(parent);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); + Field methodArgField = + Field.builder() + .setName("error") + .setType(methodArgType) + .setIsMessage(true) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("error") + .setType(methodArgType) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " Status error = Status.newBuilder().build();\n" + + " EchoResponse response = echoClient.echo(error);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder() + .setName("FoobarName") + .setPakkage(PACKAGE_NAME) + .setSupertypeReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + .build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(methodArgType) + .setField(methodArgField) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(name);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("content") + .setType(TypeNode.STRING) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String content = \"content951530617\";\n" + + " EchoResponse response = echoClient.echo(content);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_strinWithResourceReferenceMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String name = \"name3373707\";\n" + + " EchoResponse response = echoClient.echo(name);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String parent = \"parent-995424086\";\n" + + " EchoResponse response = echoClient.echo(parent);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); + Field nestFiled = + Field.builder() + .setName("user") + .setType(TypeNode.withReference(userRef)) + .setIsMessage(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .setNestedFields(Arrays.asList(nestFiled)) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String displayName = \"display_name1615086568\";\n" + + " EchoResponse response = echoClient.echo(displayName);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + MethodArgument arg1 = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("content").setType(TypeNode.STRING).build()) + .build(); + TypeNode severityType = + TypeNode.withReference( + VaporReference.builder().setName("Severity").setPakkage(PACKAGE_NAME).build()); + MethodArgument arg2 = + MethodArgument.builder() + .setName("severity") + .setType(severityType) + .setField( + Field.builder().setName("severity").setType(severityType).setIsEnum(true).build()) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg1, arg2)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String content = \"content951530617\";\n" + + " Severity severity = Severity.forNumber(0);\n" + + " EchoResponse response = echoClient.echo(content, severity);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("DeleteUserRequest") + .setPakkage("com.google.showcase.v1beta1") + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("Empty").setPakkage("com.google.protobuf").build()); + List> methodSignatures = + Arrays.asList( + Arrays.asList( + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("name").setType(TypeNode.STRING).build()) + .build())); + Method unaryMethod = + Method.builder() + .setName("delete") + .setMethodSignatures(methodSignatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, methodSignatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String name = \"name3373707\";\n" + + " echoClient.delete(name);\n" + + "}"; + Assert.assertEquals(results, expected); + } +} diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 45cfef387a..89d8a1cd76 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -154,6 +154,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   ResourceName parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(parent);
+   * }
+   * }
+ * * @param parent * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -165,6 +174,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   Status error = Status.newBuilder().build();
+   *   EchoResponse response = echoClient.echo(error);
+   * }
+   * }
+ * * @param error * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -175,6 +193,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   FoobarName name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -186,6 +213,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String content = "content951530617";
+   *   EchoResponse response = echoClient.echo(content);
+   * }
+   * }
+ * * @param content * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -196,6 +232,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String name = "name3373707";
+   *   EchoResponse response = echoClient.echo(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -206,6 +251,15 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String parent = "parent-995424086";
+   *   EchoResponse response = echoClient.echo(parent);
+   * }
+   * }
+ * * @param parent * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -216,6 +270,16 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   String content = "content951530617";
+   *   Severity severity = Severity.forNumber(0);
+   *   EchoResponse response = echoClient.echo(content, severity);
+   * }
+   * }
+ * * @param content * @param severity * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden index db54847763..ea7ae6e96c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden @@ -124,6 +124,17 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String parent = "parent-995424086";
+   *   String displayName = "display_name1615086568";
+   *   String email = "email96619420";
+   *   User response = identityClient.createUser(parent, displayName, email);
+   * }
+   * }
+ * * @param parent * @param display_name * @param email @@ -141,6 +152,23 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String parent = "parent-995424086";
+   *   String displayName = "display_name1615086568";
+   *   String email = "email96619420";
+   *   int age = 96511;
+   *   String nickname = "nickname70690926";
+   *   boolean enableNotifications = true;
+   *   double heightFeet = -1032737338;
+   *   User response =
+   *       identityClient.createUser(
+   *           parent, displayName, email, age, nickname, enableNotifications, heightFeet);
+   * }
+   * }
+ * * @param parent * @param display_name * @param email @@ -188,6 +216,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   UserName name = UserName.of("[USER]");
+   *   User response = identityClient.getUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -199,6 +236,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String name = "name3373707";
+   *   User response = identityClient.getUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -239,6 +285,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   UserName name = UserName.of("[USER]");
+   *   identityClient.deleteUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -250,6 +305,15 @@ public class IdentityClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (IdentityClient identityClient = IdentityClient.create()) {
+   *   String name = "name3373707";
+   *   identityClient.deleteUser(name);
+   * }
+   * }
+ * * @param name * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index 2ade6c30d5..fd4a60ae4a 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -245,6 +245,15 @@ public final BatchGetAssetsHistoryResponse batchGetAssetsHistory( /** * Creates a feed in a parent project/folder/organization to listen to its asset updates. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String parent = "parent-995424086";
+   *   Feed response = assetServiceClient.createFeed(parent);
+   * }
+   * }
+ * * @param parent Required. The name of the project/folder/organization where this feed should be * created in. It can only be an organization number (such as "organizations/123"), a folder * number (such as "folders/123"), a project ID (such as "projects/my-project-id")", or a @@ -281,6 +290,15 @@ public final UnaryCallable createFeedCallable() { /** * Gets details about an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   Feed response = assetServiceClient.getFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the Feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -296,6 +314,15 @@ public final Feed getFeed(FeedName name) { /** * Gets details about an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Feed response = assetServiceClient.getFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the Feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -331,6 +358,15 @@ public final UnaryCallable getFeedCallable() { /** * Lists all asset feeds in a parent project/folder/organization. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String parent = "parent-995424086";
+   *   ListFeedsResponse response = assetServiceClient.listFeeds(parent);
+   * }
+   * }
+ * * @param parent Required. The parent project/folder/organization whose feeds are to be listed. It * can only be using project/folder/organization number (such as "folders/12345")", or a * project ID (such as "projects/my-project-id"). @@ -366,6 +402,15 @@ public final UnaryCallable listFeedsCallabl /** * Updates an asset feed configuration. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   Feed feed = Feed.newBuilder().build();
+   *   Feed response = assetServiceClient.updateFeed(feed);
+   * }
+   * }
+ * * @param feed Required. The new values of feed details. It must match an existing feed and the * field `name` must be in the format of: projects/project_number/feeds/feed_id or * folders/folder_number/feeds/feed_id or organizations/organization_number/feeds/feed_id. @@ -401,6 +446,15 @@ public final UnaryCallable updateFeedCallable() { /** * Deletes an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   assetServiceClient.deleteFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id @@ -416,6 +470,15 @@ public final void deleteFeed(FeedName name) { /** * Deletes an asset feed. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String name = "name3373707";
+   *   assetServiceClient.deleteFeed(name);
+   * }
+   * }
+ * * @param name Required. The name of the feed and it must be in the format of: * projects/project_number/feeds/feed_id folders/folder_number/feeds/feed_id * organizations/organization_number/feeds/feed_id diff --git a/test/integration/goldens/library/LibraryServiceClient.java b/test/integration/goldens/library/LibraryServiceClient.java index 033e0b3b3d..01ee8cf2e6 100644 --- a/test/integration/goldens/library/LibraryServiceClient.java +++ b/test/integration/goldens/library/LibraryServiceClient.java @@ -170,6 +170,15 @@ public LibraryServiceStub getStub() { /** * Creates a shelf, and returns the new Shelf. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   Shelf shelf = Shelf.newBuilder().build();
+   *   Shelf response = libraryServiceClient.createShelf(shelf);
+   * }
+   * }
+ * * @param shelf The shelf to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -203,6 +212,15 @@ public final UnaryCallable createShelfCallable() { /** * Gets a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.getShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -216,6 +234,15 @@ public final Shelf getShelf(ShelfName name) { /** * Gets a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Shelf response = libraryServiceClient.getShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -284,6 +311,15 @@ public final UnaryCallable listShelvesC /** * Deletes a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   libraryServiceClient.deleteShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to delete. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -297,6 +333,15 @@ public final void deleteShelf(ShelfName name) { /** * Deletes a shelf. Returns NOT_FOUND if the shelf does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   libraryServiceClient.deleteShelf(name);
+   * }
+   * }
+ * * @param name The name of the shelf to delete. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -335,6 +380,16 @@ public final UnaryCallable deleteShelfCallable() { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -357,6 +412,16 @@ public final Shelf mergeShelves(ShelfName name, ShelfName otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   String otherShelfName = "other_shelf_name145746959";
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -379,6 +444,16 @@ public final Shelf mergeShelves(ShelfName name, String otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -401,6 +476,16 @@ public final Shelf mergeShelves(String name, ShelfName otherShelfName) { *

Returns NOT_FOUND if either shelf does not exist. This call is a no-op if the specified * shelves are the same. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   String otherShelfName = "other_shelf_name145746959";
+   *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the shelf we're adding books to. * @param other_shelf_name The name of the shelf we're removing books from and deleting. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -446,6 +531,16 @@ public final UnaryCallable mergeShelvesCallable() { /** * Creates a book, and returns the new Book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.createBook(name, book);
+   * }
+   * }
+ * * @param name The name of the shelf in which the book is created. * @param book The book to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -463,6 +558,16 @@ public final Book createBook(ShelfName name, Book book) { /** * Creates a book, and returns the new Book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.createBook(name, book);
+   * }
+   * }
+ * * @param name The name of the shelf in which the book is created. * @param book The book to create. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -497,6 +602,15 @@ public final UnaryCallable createBookCallable() { /** * Gets a book. Returns NOT_FOUND if the book does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   Book response = libraryServiceClient.getBook(name);
+   * }
+   * }
+ * * @param name The name of the book to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -510,6 +624,15 @@ public final Book getBook(BookName name) { /** * Gets a book. Returns NOT_FOUND if the book does not exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   Book response = libraryServiceClient.getBook(name);
+   * }
+   * }
+ * * @param name The name of the book to retrieve. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -631,6 +754,15 @@ public final UnaryCallable deleteBookCallable() { * Updates a book. Returns INVALID_ARGUMENT if the name of the book is non-empty and does not * equal the existing name. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   Book book = Book.newBuilder().build();
+   *   Book response = libraryServiceClient.updateBook(book);
+   * }
+   * }
+ * * @param book The book to update with. The name must match or be empty. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -667,6 +799,16 @@ public final UnaryCallable updateBookCallable() { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -685,6 +827,16 @@ public final Book moveBook(BookName name, ShelfName otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
+   *   String otherShelfName = "other_shelf_name145746959";
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -703,6 +855,16 @@ public final Book moveBook(BookName name, String otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   ShelfName otherShelfName = ShelfName.of("[SHELF_ID]");
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -721,6 +883,16 @@ public final Book moveBook(String name, ShelfName otherShelfName) { * Moves a book to another shelf, and returns the new book. The book id of the new book may not be * the same as the original book. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   String otherShelfName = "other_shelf_name145746959";
+   *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
+   * }
+   * }
+ * * @param name The name of the book to move. * @param other_shelf_name The name of the destination shelf. * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index 507ea5ed4a..f7a7793a57 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -475,6 +475,15 @@ public final UnaryCallable listSinksCallabl /** * Gets a sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink response = configClient.getSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The resource name of the sink: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" * "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]" @@ -495,6 +504,15 @@ public final LogSink getSink(LogSinkName sinkName) { /** * Gets a sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = "sink_name-1391757129";
+   *   LogSink response = configClient.getSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The resource name of the sink: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" * "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]" @@ -536,6 +554,16 @@ public final UnaryCallable getSinkCallable() { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -560,6 +588,16 @@ public final LogSink createSink(BillingAccountName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -584,6 +622,16 @@ public final LogSink createSink(FolderName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -608,6 +656,16 @@ public final LogSink createSink(OrganizationName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -632,6 +690,16 @@ public final LogSink createSink(ProjectName parent, LogSink sink) { * permitted to write to the destination. A sink can export log entries only from the resource * owning the sink. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = "parent-995424086";
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.createSink(parent, sink);
+   * }
+   * }
+ * * @param parent Required. The resource in which to create the sink: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -681,6 +749,16 @@ public final UnaryCallable createSinkCallable() { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -709,6 +787,16 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink) { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = "sink_name-1391757129";
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -734,6 +822,17 @@ public final LogSink updateSink(String sinkName, LogSink sink) { *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -772,6 +871,17 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink, FieldMask up *

The updated sink might also have a new `writer_identity`; see the `unique_writer_identity` * field. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = "sink_name-1391757129";
+   *   LogSink sink = LogSink.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to update, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -836,6 +946,15 @@ public final UnaryCallable updateSinkCallable() { * Deletes a sink. If the sink has a unique `writer_identity`, then that service account is also * deleted. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   configClient.deleteSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to delete, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -858,6 +977,15 @@ public final void deleteSink(LogSinkName sinkName) { * Deletes a sink. If the sink has a unique `writer_identity`, then that service account is also * deleted. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String sinkName = "sink_name-1391757129";
+   *   configClient.deleteSink(sinkName);
+   * }
+   * }
+ * * @param sink_name Required. The full resource name of the sink to delete, including the parent * resource and the sink identifier: *

"projects/[PROJECT_ID]/sinks/[SINK_ID]" @@ -1014,6 +1142,15 @@ public final ListExclusionsPagedResponse listExclusions(ListExclusionsRequest re /** * Gets the description of an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   LogExclusion response = configClient.getExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1032,6 +1169,15 @@ public final LogExclusion getExclusion(LogExclusionName name) { /** * Gets the description of an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = "name3373707";
+   *   LogExclusion response = configClient.getExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1071,6 +1217,16 @@ public final UnaryCallable getExclusionCallab * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1093,6 +1249,16 @@ public final LogExclusion createExclusion(BillingAccountName parent, LogExclusio * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1115,6 +1281,16 @@ public final LogExclusion createExclusion(FolderName parent, LogExclusion exclus * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1137,6 +1313,16 @@ public final LogExclusion createExclusion(OrganizationName parent, LogExclusion * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1159,6 +1345,16 @@ public final LogExclusion createExclusion(ProjectName parent, LogExclusion exclu * Creates a new exclusion in a specified parent resource. Only log entries belonging to that * resource can be excluded. You can have up to 10 exclusions in a resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = "parent-995424086";
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   * }
+   * }
+ * * @param parent Required. The parent resource in which to create the exclusion: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1200,6 +1396,17 @@ public final UnaryCallable createExclusion /** * Changes one or more properties of an existing exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
+   * }
+   * }
+ * * @param name Required. The resource name of the exclusion to update: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1231,6 +1438,17 @@ public final LogExclusion updateExclusion( /** * Changes one or more properties of an existing exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = "name3373707";
+   *   LogExclusion exclusion = LogExclusion.newBuilder().build();
+   *   FieldMask updateMask = FieldMask.newBuilder().build();
+   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
+   * }
+   * }
+ * * @param name Required. The resource name of the exclusion to update: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1283,6 +1501,15 @@ public final UnaryCallable updateExclusion /** * Deletes an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   configClient.deleteExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion to delete: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" @@ -1301,6 +1528,15 @@ public final void deleteExclusion(LogExclusionName name) { /** * Deletes an exclusion. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String name = "name3373707";
+   *   configClient.deleteExclusion(name);
+   * }
+   * }
+ * * @param name Required. The resource name of an existing exclusion to delete: *

"projects/[PROJECT_ID]/exclusions/[EXCLUSION_ID]" * "organizations/[ORGANIZATION_ID]/exclusions/[EXCLUSION_ID]" diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java index 2b7cef1ad5..2d1a797418 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -163,6 +163,15 @@ public LoggingServiceV2Stub getStub() { * written shortly before the delete operation might not be deleted. Entries received after the * delete operation with a timestamp before the operation will be deleted. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   loggingClient.deleteLog(logName);
+   * }
+   * }
+ * * @param log_name Required. The resource name of the log to delete: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]" "folders/[FOLDER_ID]/logs/[LOG_ID]" @@ -185,6 +194,15 @@ public final void deleteLog(LogName logName) { * written shortly before the delete operation might not be deleted. Entries received after the * delete operation with a timestamp before the operation will be deleted. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   String logName = "log_name2013526694";
+   *   loggingClient.deleteLog(logName);
+   * }
+   * }
+ * * @param log_name Required. The resource name of the log to delete: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]" "folders/[FOLDER_ID]/logs/[LOG_ID]" @@ -230,6 +248,19 @@ public final UnaryCallable deleteLogCallable() { * libraries configured to use Logging. A single request may contain log entries for a maximum of * 1000 different resources (projects, organizations, billing accounts or folders) * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   MonitoredResource resource = MonitoredResource.newBuilder().build();
+   *   Map labels = new HashMap<>();
+   *   List entries = new ArrayList<>();
+   *   WriteLogEntriesResponse response =
+   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
+   * }
+   * }
+ * * @param log_name Optional. A default log resource name that is assigned to all log entries in * `entries` that do not specify a value for `log_name`: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" @@ -292,6 +323,19 @@ public final WriteLogEntriesResponse writeLogEntries( * libraries configured to use Logging. A single request may contain log entries for a maximum of * 1000 different resources (projects, organizations, billing accounts or folders) * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   String logName = "log_name2013526694";
+   *   MonitoredResource resource = MonitoredResource.newBuilder().build();
+   *   Map labels = new HashMap<>();
+   *   List entries = new ArrayList<>();
+   *   WriteLogEntriesResponse response =
+   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
+   * }
+   * }
+ * * @param log_name Optional. A default log resource name that is assigned to all log entries in * `entries` that do not specify a value for `log_name`: *

"projects/[PROJECT_ID]/logs/[LOG_ID]" "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]" diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java index a7a58f48b8..1bcc0eaf2a 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -214,6 +214,15 @@ public final ListLogMetricsPagedResponse listLogMetrics(ListLogMetricsRequest re /** * Gets a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   LogMetric response = metricsClient.getLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the desired metric: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -230,6 +239,15 @@ public final LogMetric getLogMetric(LogMetricName metricName) { /** * Gets a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = "metric_name-1737602118";
+   *   LogMetric response = metricsClient.getLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the desired metric: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -265,6 +283,16 @@ public final UnaryCallable getLogMetricCallable( /** * Creates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
+   * }
+   * }
+ * * @param parent Required. The resource name of the project in which to create the metric: *

"projects/[PROJECT_ID]" *

The new metric must be provided in the request. @@ -285,6 +313,16 @@ public final LogMetric createLogMetric(ProjectName parent, LogMetric metric) { /** * Creates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String parent = "parent-995424086";
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
+   * }
+   * }
+ * * @param parent Required. The resource name of the project in which to create the metric: *

"projects/[PROJECT_ID]" *

The new metric must be provided in the request. @@ -323,6 +361,16 @@ public final UnaryCallable createLogMetricCal /** * Creates or updates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to update: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" *

The updated metric must be provided in the request and it's `name` field must be the @@ -344,6 +392,16 @@ public final LogMetric updateLogMetric(LogMetricName metricName, LogMetric metri /** * Creates or updates a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = "metric_name-1737602118";
+   *   LogMetric metric = LogMetric.newBuilder().build();
+   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to update: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" *

The updated metric must be provided in the request and it's `name` field must be the @@ -383,6 +441,15 @@ public final UnaryCallable updateLogMetricCal /** * Deletes a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   metricsClient.deleteLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to delete: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -399,6 +466,15 @@ public final void deleteLogMetric(LogMetricName metricName) { /** * Deletes a logs-based metric. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String metricName = "metric_name-1737602118";
+   *   metricsClient.deleteLogMetric(metricName);
+   * }
+   * }
+ * * @param metric_name Required. The resource name of the metric to delete: *

"projects/[PROJECT_ID]/metrics/[METRIC_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index d58b981828..a362c54c05 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -290,6 +290,15 @@ public final UnaryCallable listInst /** * Gets the details of a specific Redis instance. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   Instance response = cloudRedisClient.getInstance(name);
+   * }
+   * }
+ * * @param name Required. Redis instance resource name using the form: * `projects/{project_id}/locations/{location_id}/instances/{instance_id}` where `location_id` * refers to a GCP region. @@ -305,6 +314,15 @@ public final Instance getInstance(InstanceName name) { /** * Gets the details of a specific Redis instance. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   String name = "name3373707";
+   *   Instance response = cloudRedisClient.getInstance(name);
+   * }
+   * }
+ * * @param name Required. Redis instance resource name using the form: * `projects/{project_id}/locations/{location_id}/instances/{instance_id}` where `location_id` * refers to a GCP region. From c06bc3722d25fbaab86eb4e386a339f5dc8e362f Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 1 Dec 2020 00:04:03 -0800 Subject: [PATCH 08/32] modify body expr --- .../composer/MethodSampleCodeHelperComposer.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java index ec2e4e9c19..bd8d6278e3 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java @@ -26,7 +26,6 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -42,7 +41,7 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); // Assign each method arguments with its default value. Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); - List methodArgumentsAssignmentExpr = + List bodyExpr = assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); List methodVarExprs = arguments.stream() @@ -52,28 +51,23 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( // e.g. if return void, echoClient.echo(..); or, // e.g. if return other type, EchoResponse response = echoClient.echo(...); boolean returnsVoid = isProtoEmptyType(method.outputType()); - Expr responseExpr = null; if (returnsVoid) { - responseExpr = + bodyExpr.add( MethodInvocationExpr.builder() .setExprReferenceExpr(clientVarExpr) .setMethodName(JavaStyle.toLowerCamelCase(method.name())) .setArguments(methodVarExprs) .setReturnType(clientType) - .build(); + .build()); } else { - responseExpr = + bodyExpr.add( createAssignExprForVariableWithClientMethod( createVariableExpr(RESPONSE, method.outputType()), clientVarExpr, JavaStyle.toLowerCamelCase(method.name()), - methodVarExprs); + methodVarExprs)); } - List bodyExpr = new ArrayList<>(); - bodyExpr.addAll(methodArgumentsAssignmentExpr); - bodyExpr.add(responseExpr); - return TryCatchStatement.builder() .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) .setTryBody( From 58b366aba607d14e37ef85a585b22802c25a54a5 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 16:34:39 -0800 Subject: [PATCH 09/32] flattern varialbe expr and fix default value string --- .../MethodSampleCodeHelperComposer.java | 115 ++++++++++++------ .../ServiceClientCommentComposer.java | 2 +- .../ServiceClientSampleCodeComposer.java | 1 - .../gapic/composer/goldens/EchoClient.golden | 16 ++- .../composer/goldens/IdentityClient.golden | 22 ++-- .../goldens/asset/AssetServiceClient.java | 8 +- .../goldens/logging/ConfigClient.java | 36 +++--- .../goldens/logging/LoggingClient.java | 8 +- .../goldens/logging/MetricsClient.java | 16 +-- .../goldens/redis/CloudRedisClient.java | 4 +- 10 files changed, 138 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java index bd8d6278e3..bf289cc5a0 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.composer; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.ConcreteReference; import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; import com.google.api.generator.engine.ast.MethodInvocationExpr; @@ -26,6 +27,7 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -38,15 +40,16 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( List arguments, TypeNode clientType, Map resourceNames) { - VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) + .setType(clientType) + .build()); // Assign each method arguments with its default value. - Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); + List methodArgExprs = createMethodArgVarExprs(arguments, resourceNames); List bodyExpr = - assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); - List methodVarExprs = - arguments.stream() - .map(arg -> methodArgVarExprMap.get(arg.name())) - .collect(Collectors.toList()); + assignMethodArgumentsWithDefaultValues(arguments, methodArgExprs, resourceNames); // Invoke current method based on return type. // e.g. if return void, echoClient.echo(..); or, // e.g. if return other type, EchoResponse response = echoClient.echo(...); @@ -56,16 +59,19 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( MethodInvocationExpr.builder() .setExprReferenceExpr(clientVarExpr) .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(methodVarExprs) + .setArguments(methodArgExprs) .setReturnType(clientType) .build()); } else { + VariableExpr responseVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(RESPONSE).setType(method.outputType()).build()); bodyExpr.add( createAssignExprForVariableWithClientMethod( - createVariableExpr(RESPONSE, method.outputType()), + responseVarExpr, clientVarExpr, JavaStyle.toLowerCamelCase(method.name()), - methodVarExprs)); + methodArgExprs)); } return TryCatchStatement.builder() @@ -93,30 +99,72 @@ private static AssignmentExpr assignClientVariableWithCreateMethodExpr( .build(); } - // Create a Map where key is method's argument name, and value is its VariableExpr. - private static Map createMethodArgumentsVariableExprs( - List arguments) { + // Create a list of Expr for method argument variable expression. + private static List createMethodArgVarExprs( + List arguments, Map resourceNames) { return arguments.stream() - .collect( - Collectors.toMap( - methodArg -> methodArg.name(), - methodArg -> - createVariableExpr( - JavaStyle.toLowerCamelCase(methodArg.name()), methodArg.type()))); + .map( + arg -> { + VariableExpr argVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(arg.type()) + .build()); + if (arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey( + arg.field().resourceReference().resourceTypeString())) { + return MethodInvocationExpr.builder() + .setExprReferenceExpr(argVarExpr) + .setMethodName("toString") + .build(); + } + return argVarExpr; + }) + .collect(Collectors.toList()); } // Return a list of AssignmentExpr for method argument with its default value. private static List assignMethodArgumentsWithDefaultValues( List arguments, - Map argVarExprs, + List argVarExprs, Map resourceNames) { - return arguments.stream() - .map( - arg -> - createAssignmentExpr( - argVarExprs.get(arg.name()), - DefaultValueComposer.createDefaultValue(arg, resourceNames))) - .collect(Collectors.toList()); + List resourceNameList = + resourceNames.values().stream().collect(Collectors.toList()); + List assignmentExprs = new ArrayList<>(); + for (int i = 0; i < arguments.size(); i++) { + MethodArgument arg = arguments.get(i); + VariableExpr argVarExpr = + (argVarExprs.get(i) instanceof VariableExpr) ? (VariableExpr) argVarExprs.get(i) : null; + Expr defaultValueExpr = DefaultValueComposer.createDefaultValue(arg, resourceNames); + if (arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString())) { + ResourceName resourceName = + resourceNames.get(arg.field().resourceReference().resourceTypeString()); + defaultValueExpr = + DefaultValueComposer.createDefaultValue( + resourceName, resourceNameList, arg.field().name()); + TypeNode resourceReferenceType = + arg.field().resourceReference().isChildType() + ? TypeNode.withReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + : defaultValueExpr.type(); + argVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(resourceReferenceType) + .build()); + } + assignmentExprs.add( + AssignmentExpr.builder() + .setVariableExpr(argVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(defaultValueExpr) + .build()); + } + return assignmentExprs; } private static Expr createAssignExprForVariableWithClientMethod( @@ -145,17 +193,4 @@ private static boolean isProtoEmptyType(TypeNode type) { return type.reference().pakkage().equals("com.google.protobuf") && type.reference().name().equals("Empty"); } - - private static AssignmentExpr createAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { - return AssignmentExpr.builder() - .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(valueExpr) - .build(); - } - - private static VariableExpr createVariableExpr(String variableName, TypeNode type) { - return VariableExpr.builder() - .setVariable(Variable.builder().setName(variableName).setType(type).build()) - .build(); - } } diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java index 2d512a4ad0..cdd3ce4a2e 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java @@ -170,7 +170,7 @@ static List createRpcMethodHeaderComment( processProtobufComment(method.description(), methodJavadocBuilder, null); } - if (!sampleCode.isEmpty()) { + if (!Strings.isNullOrEmpty(sampleCode)) { methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); methodJavadocBuilder.addSampleCode(sampleCode); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index f8b57ea290..4147d72bec 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -32,7 +32,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class ServiceClientSampleCodeComposer { // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 89d8a1cd76..2b81181e14 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -144,6 +144,14 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   EchoResponse response = echoClient.echo();
+   * }
+   * }
+ * * @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 */ @@ -236,8 +244,8 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   String name = "name3373707";
-   *   EchoResponse response = echoClient.echo(name);
+   *   FoobarName name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(name.toString());
    * }
    * }
* @@ -255,8 +263,8 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   String parent = "parent-995424086";
-   *   EchoResponse response = echoClient.echo(parent);
+   *   ResourceName parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
+   *   EchoResponse response = echoClient.echo(parent.toString());
    * }
    * }
* diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden index ea7ae6e96c..ff13c4eea1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden @@ -128,10 +128,10 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   String parent = "parent-995424086";
+   *   ResourceName parent = UserName.of("[USER]");
    *   String displayName = "display_name1615086568";
    *   String email = "email96619420";
-   *   User response = identityClient.createUser(parent, displayName, email);
+   *   User response = identityClient.createUser(parent.toString(), displayName, email);
    * }
    * }
* @@ -156,7 +156,7 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   String parent = "parent-995424086";
+   *   ResourceName parent = UserName.of("[USER]");
    *   String displayName = "display_name1615086568";
    *   String email = "email96619420";
    *   int age = 96511;
@@ -165,7 +165,13 @@ public class IdentityClient implements BackgroundResource {
    *   double heightFeet = -1032737338;
    *   User response =
    *       identityClient.createUser(
-   *           parent, displayName, email, age, nickname, enableNotifications, heightFeet);
+   *           parent.toString(),
+   *           displayName,
+   *           email,
+   *           age,
+   *           nickname,
+   *           enableNotifications,
+   *           heightFeet);
    * }
    * }
* @@ -240,8 +246,8 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   String name = "name3373707";
-   *   User response = identityClient.getUser(name);
+   *   UserName name = UserName.of("[USER]");
+   *   User response = identityClient.getUser(name.toString());
    * }
    * }
* @@ -309,8 +315,8 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   String name = "name3373707";
-   *   identityClient.deleteUser(name);
+   *   UserName name = UserName.of("[USER]");
+   *   identityClient.deleteUser(name.toString());
    * }
    * }
* diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index fd4a60ae4a..0ced58fb60 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -318,8 +318,8 @@ public final Feed getFeed(FeedName name) { * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   String name = "name3373707";
-   *   Feed response = assetServiceClient.getFeed(name);
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   Feed response = assetServiceClient.getFeed(name.toString());
    * }
    * }
* @@ -474,8 +474,8 @@ public final void deleteFeed(FeedName name) { * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   String name = "name3373707";
-   *   assetServiceClient.deleteFeed(name);
+   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
+   *   assetServiceClient.deleteFeed(name.toString());
    * }
    * }
* diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index f7a7793a57..5eb1285b1a 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -508,8 +508,8 @@ public final LogSink getSink(LogSinkName sinkName) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String sinkName = "sink_name-1391757129";
-   *   LogSink response = configClient.getSink(sinkName);
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   LogSink response = configClient.getSink(sinkName.toString());
    * }
    * }
* @@ -694,9 +694,9 @@ public final LogSink createSink(ProjectName parent, LogSink sink) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String parent = "parent-995424086";
+   *   ResourceName parent = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
    *   LogSink sink = LogSink.newBuilder().build();
-   *   LogSink response = configClient.createSink(parent, sink);
+   *   LogSink response = configClient.createSink(parent.toString(), sink);
    * }
    * }
* @@ -791,9 +791,9 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String sinkName = "sink_name-1391757129";
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
    *   LogSink sink = LogSink.newBuilder().build();
-   *   LogSink response = configClient.updateSink(sinkName, sink);
+   *   LogSink response = configClient.updateSink(sinkName.toString(), sink);
    * }
    * }
* @@ -875,10 +875,10 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink, FieldMask up * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String sinkName = "sink_name-1391757129";
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
    *   LogSink sink = LogSink.newBuilder().build();
    *   FieldMask updateMask = FieldMask.newBuilder().build();
-   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
+   *   LogSink response = configClient.updateSink(sinkName.toString(), sink, updateMask);
    * }
    * }
* @@ -981,8 +981,8 @@ public final void deleteSink(LogSinkName sinkName) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String sinkName = "sink_name-1391757129";
-   *   configClient.deleteSink(sinkName);
+   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   configClient.deleteSink(sinkName.toString());
    * }
    * }
* @@ -1173,8 +1173,8 @@ public final LogExclusion getExclusion(LogExclusionName name) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String name = "name3373707";
-   *   LogExclusion response = configClient.getExclusion(name);
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   LogExclusion response = configClient.getExclusion(name.toString());
    * }
    * }
* @@ -1349,9 +1349,9 @@ public final LogExclusion createExclusion(ProjectName parent, LogExclusion exclu * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String parent = "parent-995424086";
+   *   ResourceName parent = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
    *   LogExclusion exclusion = LogExclusion.newBuilder().build();
-   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
+   *   LogExclusion response = configClient.createExclusion(parent.toString(), exclusion);
    * }
    * }
* @@ -1442,10 +1442,10 @@ public final LogExclusion updateExclusion( * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String name = "name3373707";
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
    *   LogExclusion exclusion = LogExclusion.newBuilder().build();
    *   FieldMask updateMask = FieldMask.newBuilder().build();
-   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
+   *   LogExclusion response = configClient.updateExclusion(name.toString(), exclusion, updateMask);
    * }
    * }
* @@ -1532,8 +1532,8 @@ public final void deleteExclusion(LogExclusionName name) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String name = "name3373707";
-   *   configClient.deleteExclusion(name);
+   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   configClient.deleteExclusion(name.toString());
    * }
    * }
* diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java index 2d1a797418..a60142afdc 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -198,8 +198,8 @@ public final void deleteLog(LogName logName) { * *
{@code
    * try (LoggingClient loggingClient = LoggingClient.create()) {
-   *   String logName = "log_name2013526694";
-   *   loggingClient.deleteLog(logName);
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   loggingClient.deleteLog(logName.toString());
    * }
    * }
* @@ -327,12 +327,12 @@ public final WriteLogEntriesResponse writeLogEntries( * *
{@code
    * try (LoggingClient loggingClient = LoggingClient.create()) {
-   *   String logName = "log_name2013526694";
+   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
    *   MonitoredResource resource = MonitoredResource.newBuilder().build();
    *   Map labels = new HashMap<>();
    *   List entries = new ArrayList<>();
    *   WriteLogEntriesResponse response =
-   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
+   *       loggingClient.writeLogEntries(logName.toString(), resource, labels, entries);
    * }
    * }
* diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java index 1bcc0eaf2a..f2d1590c3d 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -243,8 +243,8 @@ public final LogMetric getLogMetric(LogMetricName metricName) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   String metricName = "metric_name-1737602118";
-   *   LogMetric response = metricsClient.getLogMetric(metricName);
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   LogMetric response = metricsClient.getLogMetric(metricName.toString());
    * }
    * }
* @@ -317,9 +317,9 @@ public final LogMetric createLogMetric(ProjectName parent, LogMetric metric) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   String parent = "parent-995424086";
+   *   ResourceName parent = LogMetricName.of("[PROJECT]", "[METRIC]");
    *   LogMetric metric = LogMetric.newBuilder().build();
-   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
+   *   LogMetric response = metricsClient.createLogMetric(parent.toString(), metric);
    * }
    * }
* @@ -396,9 +396,9 @@ public final LogMetric updateLogMetric(LogMetricName metricName, LogMetric metri * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   String metricName = "metric_name-1737602118";
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
    *   LogMetric metric = LogMetric.newBuilder().build();
-   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
+   *   LogMetric response = metricsClient.updateLogMetric(metricName.toString(), metric);
    * }
    * }
* @@ -470,8 +470,8 @@ public final void deleteLogMetric(LogMetricName metricName) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   String metricName = "metric_name-1737602118";
-   *   metricsClient.deleteLogMetric(metricName);
+   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   metricsClient.deleteLogMetric(metricName.toString());
    * }
    * }
* diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index a362c54c05..b952a9ce37 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -318,8 +318,8 @@ public final Instance getInstance(InstanceName name) { * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   String name = "name3373707";
-   *   Instance response = cloudRedisClient.getInstance(name);
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   Instance response = cloudRedisClient.getInstance(name.toString());
    * }
    * }
* From 39d75ad9dae095b7005288e59cc31ce21d085305 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 17:34:59 -0800 Subject: [PATCH 10/32] merge HelperComposer into ServiceClientSampleCodeComposer --- .../MethodSampleCodeHelperComposer.java | 196 ------------------ .../ServiceClientSampleCodeComposer.java | 167 ++++++++++++++- .../api/generator/gapic/composer/BUILD.bazel | 2 +- ... ServiceClientSampleCodeComposerTest.java} | 186 ++++++++--------- 4 files changed, 246 insertions(+), 305 deletions(-) delete mode 100644 src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java rename src/test/java/com/google/api/generator/gapic/composer/{MethodSampleCodeHelperComposerTest.java => ServiceClientSampleCodeComposerTest.java} (84%) diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java deleted file mode 100644 index bf289cc5a0..0000000000 --- a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.api.generator.gapic.composer; - -import com.google.api.generator.engine.ast.AssignmentExpr; -import com.google.api.generator.engine.ast.ConcreteReference; -import com.google.api.generator.engine.ast.Expr; -import com.google.api.generator.engine.ast.ExprStatement; -import com.google.api.generator.engine.ast.MethodInvocationExpr; -import com.google.api.generator.engine.ast.TryCatchStatement; -import com.google.api.generator.engine.ast.TypeNode; -import com.google.api.generator.engine.ast.Variable; -import com.google.api.generator.engine.ast.VariableExpr; -import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.MethodArgument; -import com.google.api.generator.gapic.model.ResourceName; -import com.google.api.generator.gapic.utils.JavaStyle; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class MethodSampleCodeHelperComposer { - private static String RESPONSE = "response"; - - public static TryCatchStatement composeUnaryRpcMethodSampleCode( - Method method, - List arguments, - TypeNode clientType, - Map resourceNames) { - VariableExpr clientVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) - .setType(clientType) - .build()); - // Assign each method arguments with its default value. - List methodArgExprs = createMethodArgVarExprs(arguments, resourceNames); - List bodyExpr = - assignMethodArgumentsWithDefaultValues(arguments, methodArgExprs, resourceNames); - // Invoke current method based on return type. - // e.g. if return void, echoClient.echo(..); or, - // e.g. if return other type, EchoResponse response = echoClient.echo(...); - boolean returnsVoid = isProtoEmptyType(method.outputType()); - if (returnsVoid) { - bodyExpr.add( - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(methodArgExprs) - .setReturnType(clientType) - .build()); - } else { - VariableExpr responseVarExpr = - VariableExpr.withVariable( - Variable.builder().setName(RESPONSE).setType(method.outputType()).build()); - bodyExpr.add( - createAssignExprForVariableWithClientMethod( - responseVarExpr, - clientVarExpr, - JavaStyle.toLowerCamelCase(method.name()), - methodArgExprs)); - } - - return TryCatchStatement.builder() - .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) - .setTryBody( - bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) - .setIsSampleCode(true) - .build(); - } - - // ==================================Helpers===================================================// - - // Assign client variable expr with create client. - // e.g EchoClient echoClient = EchoClient.create() - private static AssignmentExpr assignClientVariableWithCreateMethodExpr( - VariableExpr clientVarExpr) { - return AssignmentExpr.builder() - .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr( - MethodInvocationExpr.builder() - .setStaticReferenceType(clientVarExpr.variable().type()) - .setReturnType(clientVarExpr.variable().type()) - .setMethodName("create") - .build()) - .build(); - } - - // Create a list of Expr for method argument variable expression. - private static List createMethodArgVarExprs( - List arguments, Map resourceNames) { - return arguments.stream() - .map( - arg -> { - VariableExpr argVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(arg.name())) - .setType(arg.type()) - .build()); - if (arg.type().equals(TypeNode.STRING) - && arg.field().hasResourceReference() - && resourceNames.containsKey( - arg.field().resourceReference().resourceTypeString())) { - return MethodInvocationExpr.builder() - .setExprReferenceExpr(argVarExpr) - .setMethodName("toString") - .build(); - } - return argVarExpr; - }) - .collect(Collectors.toList()); - } - - // Return a list of AssignmentExpr for method argument with its default value. - private static List assignMethodArgumentsWithDefaultValues( - List arguments, - List argVarExprs, - Map resourceNames) { - List resourceNameList = - resourceNames.values().stream().collect(Collectors.toList()); - List assignmentExprs = new ArrayList<>(); - for (int i = 0; i < arguments.size(); i++) { - MethodArgument arg = arguments.get(i); - VariableExpr argVarExpr = - (argVarExprs.get(i) instanceof VariableExpr) ? (VariableExpr) argVarExprs.get(i) : null; - Expr defaultValueExpr = DefaultValueComposer.createDefaultValue(arg, resourceNames); - if (arg.type().equals(TypeNode.STRING) - && arg.field().hasResourceReference() - && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString())) { - ResourceName resourceName = - resourceNames.get(arg.field().resourceReference().resourceTypeString()); - defaultValueExpr = - DefaultValueComposer.createDefaultValue( - resourceName, resourceNameList, arg.field().name()); - TypeNode resourceReferenceType = - arg.field().resourceReference().isChildType() - ? TypeNode.withReference( - ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) - : defaultValueExpr.type(); - argVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(arg.name())) - .setType(resourceReferenceType) - .build()); - } - assignmentExprs.add( - AssignmentExpr.builder() - .setVariableExpr(argVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(defaultValueExpr) - .build()); - } - return assignmentExprs; - } - - private static Expr createAssignExprForVariableWithClientMethod( - VariableExpr variableExpr, - VariableExpr clientVarExpr, - String methodName, - List argumentsVarExprs) { - MethodInvocationExpr clientMethodInvocationExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(methodName)) - .setArguments(argumentsVarExprs) - .setReturnType(variableExpr.variable().type()) - .build(); - return AssignmentExpr.builder() - .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(clientMethodInvocationExpr) - .build(); - } - - private static String getClientName(TypeNode clientType) { - return JavaStyle.toLowerCamelCase(clientType.reference().name()); - } - - private static boolean isProtoEmptyType(TypeNode type) { - return type.reference().pakkage().equals("com.google.protobuf") - && type.reference().name().equals("Empty"); - } -} diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 4147d72bec..37dfb46f69 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -20,6 +20,7 @@ import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.engine.ast.Variable; @@ -29,14 +30,17 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class ServiceClientSampleCodeComposer { - // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. + private static String RESPONSE = "response"; public static String composeClassHeaderCredentialsSampleCode( + // TODO(summerji): Add unit tests for composeClassHeaderCredentialsSampleCode. TypeNode clientType, TypeNode settingsType) { // Initialize clientSettings with builder() method. // e.g. EchoSettings echoSettings = @@ -110,6 +114,7 @@ public static String composeClassHeaderCredentialsSampleCode( } public static String composeClassHeaderEndpointSampleCode( + // TODO(summerji): Add unit tests for composeClassHeaderEndpointSampleCode. TypeNode clientType, TypeNode settingsType) { // Initialize client settings with builder() method. // e.g. EchoSettings echoSettings = EchoSettings.newBuilder().setEndpoint("myEndpoint").build(); @@ -180,15 +185,163 @@ public static String composeRpcMethodHeaderSampleCode( List arguments, TypeNode clientType, Map resourceNames) { + // TODO(summerji): Add Other types RPC methods' sample code. return SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - method, arguments, clientType, resourceNames)); + composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames)); } - // ======================================== Helpers ==========================================// + public static TryCatchStatement composeUnaryRpcMethodSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames) { + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) + .setType(clientType) + .build()); + // Assign each method arguments with its default value. + List methodArgExprs = createMethodArgVarExprs(arguments, resourceNames); + List bodyExpr = + assignMethodArgumentsWithDefaultValues(arguments, methodArgExprs, resourceNames); + // Invoke current method based on return type. + // e.g. if return void, echoClient.echo(..); or, + // e.g. if return other type, EchoResponse response = echoClient.echo(...); + boolean returnsVoid = isProtoEmptyType(method.outputType()); + if (returnsVoid) { + bodyExpr.add( + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments(methodArgExprs) + .setReturnType(clientType) + .build()); + } else { + VariableExpr responseVarExpr = + VariableExpr.withVariable( + Variable.builder().setName(RESPONSE).setType(method.outputType()).build()); + bodyExpr.add( + createAssignExprForVariableWithClientMethod( + responseVarExpr, + clientVarExpr, + JavaStyle.toLowerCamelCase(method.name()), + methodArgExprs)); + } + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody( + bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) + .setIsSampleCode(true) + .build(); + } + + // ==================================Helpers===================================================// + + // Assign client variable expr with create client. + // e.g EchoClient echoClient = EchoClient.create() + private static AssignmentExpr assignClientVariableWithCreateMethodExpr( + VariableExpr clientVarExpr) { + return AssignmentExpr.builder() + .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType(clientVarExpr.variable().type()) + .setReturnType(clientVarExpr.variable().type()) + .setMethodName("create") + .build()) + .build(); + } + + // Create a list of Expr for method argument variable expression. + private static List createMethodArgVarExprs( + List arguments, Map resourceNames) { + return arguments.stream() + .map( + arg -> { + VariableExpr argVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(arg.type()) + .build()); + if (arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey( + arg.field().resourceReference().resourceTypeString())) { + return MethodInvocationExpr.builder() + .setExprReferenceExpr(argVarExpr) + .setMethodName("toString") + .build(); + } + return argVarExpr; + }) + .collect(Collectors.toList()); + } + + // Return a list of AssignmentExpr for method argument with its default value. + private static List assignMethodArgumentsWithDefaultValues( + List arguments, + List argVarExprs, + Map resourceNames) { + List resourceNameList = + resourceNames.values().stream().collect(Collectors.toList()); + List assignmentExprs = new ArrayList<>(); + for (int i = 0; i < arguments.size(); i++) { + MethodArgument arg = arguments.get(i); + VariableExpr argVarExpr = + (argVarExprs.get(i) instanceof VariableExpr) ? (VariableExpr) argVarExprs.get(i) : null; + Expr defaultValueExpr = DefaultValueComposer.createDefaultValue(arg, resourceNames); + if (arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString())) { + ResourceName resourceName = + resourceNames.get(arg.field().resourceReference().resourceTypeString()); + defaultValueExpr = + DefaultValueComposer.createDefaultValue( + resourceName, resourceNameList, arg.field().name()); + TypeNode resourceReferenceType = + arg.field().resourceReference().isChildType() + ? TypeNode.withReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + : defaultValueExpr.type(); + argVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(resourceReferenceType) + .build()); + } + assignmentExprs.add( + AssignmentExpr.builder() + .setVariableExpr(argVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(defaultValueExpr) + .build()); + } + return assignmentExprs; + } + + private static Expr createAssignExprForVariableWithClientMethod( + VariableExpr variableExpr, + VariableExpr clientVarExpr, + String methodName, + List argumentsVarExprs) { + MethodInvocationExpr clientMethodInvocationExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(methodName)) + .setArguments(argumentsVarExprs) + .setReturnType(variableExpr.variable().type()) + .build(); + return AssignmentExpr.builder() + .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(clientMethodInvocationExpr) + .build(); + } - private static VariableExpr createVariableExpr(String variableName, TypeNode type) { - return VariableExpr.withVariable( - Variable.builder().setName(variableName).setType(type).build()); + private static boolean isProtoEmptyType(TypeNode type) { + return type.reference().pakkage().equals("com.google.protobuf") + && type.reference().name().equals("Empty"); } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel index 8456ee092f..4a91509696 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -22,7 +22,7 @@ TESTS = UPDATE_GOLDENS_TESTS + [ "DefaultValueComposerTest", "ResourceNameTokenizerTest", "RetrySettingsComposerTest", - "MethodSampleCodeHelperComposerTest", + "ServiceClientSampleCodeComposerTest", ] TEST_DEPS = [ diff --git a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java similarity index 84% rename from src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java rename to src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 152152b5bd..1225e55963 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -1,17 +1,3 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package com.google.api.generator.gapic.composer; import static junit.framework.Assert.assertEquals; @@ -26,44 +12,33 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.ResourceReference; +import com.google.api.generator.gapic.protoparser.Parser; +import com.google.protobuf.Descriptors.FileDescriptor; +import com.google.showcase.v1beta1.EchoOuterClass; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -public class MethodSampleCodeHelperComposerTest { +public class ServiceClientSampleCodeComposerTest { private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; private static final TypeNode clientType = TypeNode.withReference( VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); - Map resourceNames = new HashMap<>(); + + FileDescriptor echoFileDescriptor; + Map resourceNames; @Before public void setUp() { - ResourceName foobarResourceName = - ResourceName.builder() - .setVariableName("foobar") - .setPakkage(PACKAGE_NAME) - .setResourceTypeString("showcase.googleapis.com/Foobar") - .setPatterns( - Arrays.asList( - "projects/{project}/foobars/{foobar}", - "projects/{project}/chocolate/variants/{variant}/foobars/{foobar}", - "foobars/{foobar}", - "bar_foo/{bar_foo}/foobars/{foobar}")) - .setParentMessageName("Foobar") - .build(); - ResourceName anythingGoesResourceName = - ResourceName.createWildcard("showcase.googleapis.com/AnythingGoes", PACKAGE_NAME); - resourceNames.put("showcase.googleapis.com/Foobar", foobarResourceName); - resourceNames.put("showcase.googleapis.com/AnythingGoes", anythingGoesResourceName); + echoFileDescriptor = EchoOuterClass.getDescriptor(); + resourceNames = Parser.parseResourceNames(echoFileDescriptor); } @Test - public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { + public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -96,7 +71,7 @@ public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" @@ -107,7 +82,7 @@ public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { } @Test - public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -116,19 +91,24 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); TypeNode methodArgType = TypeNode.withReference( - VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); + VaporReference.builder() + .setName("FoobarName") + .setPakkage(PACKAGE_NAME) + .setSupertypeReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + .build()); Field methodArgField = Field.builder() - .setName("error") - .setType(methodArgType) - .setIsMessage(true) - .setIsContainedInOneof(true) + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) .build(); MethodArgument arg = MethodArgument.builder() - .setName("error") + .setName("name") .setType(methodArgType) .setField(methodArgField) + .setIsResourceNameHelper(true) .build(); List> signatures = Arrays.asList(Arrays.asList(arg)); Method unaryMethod = @@ -140,32 +120,24 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " Status error = Status.newBuilder().build();\n" - + " EchoResponse response = echoClient.echo(error);\n" + + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(name);\n" + "}"; assertEquals(expected, results); } @Test - public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); TypeNode outputType = TypeNode.withReference( VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - TypeNode methodArgType = - TypeNode.withReference( - VaporReference.builder() - .setName("FoobarName") - .setPakkage(PACKAGE_NAME) - .setSupertypeReference( - ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) - .build()); Field methodArgField = Field.builder() .setName("name") @@ -175,9 +147,8 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr MethodArgument arg = MethodArgument.builder() .setName("name") - .setType(methodArgType) + .setType(TypeNode.STRING) .setField(methodArgField) - .setIsResourceNameHelper(true) .build(); List> signatures = Arrays.asList(Arrays.asList(arg)); Method unaryMethod = @@ -189,18 +160,18 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(name);\n" + + " EchoResponse response = echoClient.echo(name.toString());\n" + "}"; assertEquals(expected, results); } @Test - public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -209,13 +180,14 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); Field methodArgField = Field.builder() - .setName("content") + .setName("parent") .setType(TypeNode.STRING) - .setIsContainedInOneof(true) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) .build(); MethodArgument arg = MethodArgument.builder() - .setName("content") + .setName("parent") .setType(TypeNode.STRING) .setField(methodArgField) .build(); @@ -229,34 +201,38 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String content = \"content951530617\";\n" - + " EchoResponse response = echoClient.echo(content);\n" + + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(parent.toString());\n" + "}"; assertEquals(expected, results); } @Test - public void composeUnaryRpcMethodSampleCode_strinWithResourceReferenceMethodArgument() { + public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); TypeNode outputType = TypeNode.withReference( VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); Field methodArgField = Field.builder() - .setName("name") - .setType(TypeNode.STRING) - .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .setName("error") + .setType(methodArgType) + .setIsMessage(true) + .setIsContainedInOneof(true) .build(); MethodArgument arg = MethodArgument.builder() - .setName("name") - .setType(TypeNode.STRING) + .setName("error") + .setType(methodArgType) .setField(methodArgField) .build(); List> signatures = Arrays.asList(Arrays.asList(arg)); @@ -269,18 +245,18 @@ public void composeUnaryRpcMethodSampleCode_strinWithResourceReferenceMethodArgu .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String name = \"name3373707\";\n" - + " EchoResponse response = echoClient.echo(name);\n" + + " Status error = Status.newBuilder().build();\n" + + " EchoResponse response = echoClient.echo(error);\n" + "}"; assertEquals(expected, results); } @Test - public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -289,18 +265,34 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); Field methodArgField = Field.builder() - .setName("parent") + .setName("display_name") .setType(TypeNode.STRING) .setResourceReference( ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) .build(); - MethodArgument arg = + Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); + Field nestFiled = + Field.builder() + .setName("user") + .setType(TypeNode.withReference(userRef)) + .setIsMessage(true) + .build(); + MethodArgument argDisplayName = MethodArgument.builder() - .setName("parent") + .setName("display_name") .setType(TypeNode.STRING) .setField(methodArgField) + .setNestedFields(Arrays.asList(nestFiled)) .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); + MethodArgument argOtherName = + MethodArgument.builder() + .setName("other_name") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("other_name").setType(TypeNode.STRING).build()) + .setNestedFields(Arrays.asList(nestFiled)) + .build(); + List> signatures = + Arrays.asList(Arrays.asList(argDisplayName, argOtherName)); Method unaryMethod = Method.builder() .setName("echo") @@ -310,18 +302,19 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String parent = \"parent-995424086\";\n" - + " EchoResponse response = echoClient.echo(parent);\n" + + " ResourceName displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " String otherName = \"other_name-182411686\";\n" + + " EchoResponse response = echoClient.echo(displayName.toString(), otherName);\n" + "}"; assertEquals(expected, results); } @Test - public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -330,24 +323,15 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); Field methodArgField = Field.builder() - .setName("display_name") + .setName("content") .setType(TypeNode.STRING) - .setResourceReference( - ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) - .build(); - Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); - Field nestFiled = - Field.builder() - .setName("user") - .setType(TypeNode.withReference(userRef)) - .setIsMessage(true) + .setIsContainedInOneof(true) .build(); MethodArgument arg = MethodArgument.builder() - .setName("display_name") + .setName("content") .setType(TypeNode.STRING) .setField(methodArgField) - .setNestedFields(Arrays.asList(nestFiled)) .build(); List> signatures = Arrays.asList(Arrays.asList(arg)); Method unaryMethod = @@ -359,12 +343,12 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String displayName = \"display_name1615086568\";\n" - + " EchoResponse response = echoClient.echo(displayName);\n" + + " String content = \"content951530617\";\n" + + " EchoResponse response = echoClient.echo(content);\n" + "}"; assertEquals(expected, results); } @@ -403,7 +387,7 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" @@ -442,7 +426,7 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { .build(); String results = SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, methodSignatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" From 0d928454e1b54c30361edac1dc5fcef9ccc53832 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 17:50:09 -0800 Subject: [PATCH 11/32] Add license --- .../ServiceClientSampleCodeComposerTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 1225e55963..46f508110f 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -1,3 +1,17 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package com.google.api.generator.gapic.composer; import static junit.framework.Assert.assertEquals; From b24146fa9f5b524349d135976ef87b39e8a3c40d Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Wed, 2 Dec 2020 17:53:06 -0800 Subject: [PATCH 12/32] Flattern the createVariableExpr wrapper (#581) --- .../gapic/composer/ServiceClientSampleCodeComposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 37dfb46f69..5ade4bd9ae 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -37,7 +37,7 @@ import java.util.stream.Collectors; public class ServiceClientSampleCodeComposer { - private static String RESPONSE = "response"; + // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. public static String composeClassHeaderCredentialsSampleCode( // TODO(summerji): Add unit tests for composeClassHeaderCredentialsSampleCode. From 4735c407063da67ce371ba7d55b8d0952f54cbe1 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 3 Dec 2020 18:39:35 -0800 Subject: [PATCH 13/32] refactor assignment expr of default value on method arguments --- .../composer/ServiceClientClassComposer.java | 14 +- .../ServiceClientCommentComposer.java | 9 +- .../ServiceClientSampleCodeComposer.java | 148 +++++++++--------- .../ServiceClientSampleCodeComposerTest.java | 12 +- .../gapic/composer/goldens/EchoClient.golden | 8 +- .../composer/goldens/IdentityClient.golden | 22 +-- .../goldens/asset/AssetServiceClient.java | 8 +- .../goldens/logging/ConfigClient.java | 37 ++--- .../goldens/logging/LoggingClient.java | 8 +- .../goldens/logging/MetricsClient.java | 16 +- .../goldens/redis/CloudRedisClient.java | 4 +- 11 files changed, 141 insertions(+), 145 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 468d6fe024..3e7a2280f4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -80,6 +80,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -479,11 +480,11 @@ private static List createServiceMethods( Map types, Map resourceNames) { List javaMethods = new ArrayList<>(); - String clientName = getClientClassName(service); for (Method method : service.methods()) { if (method.stream().equals(Stream.NONE)) { javaMethods.addAll( - createMethodVariants(method, messageTypes, types, clientName, resourceNames)); + createMethodVariants( + method, getClientClassName(service), messageTypes, types, resourceNames)); javaMethods.add(createMethodDefaultMethod(method, types)); } if (method.hasLro()) { @@ -499,9 +500,9 @@ private static List createServiceMethods( private static List createMethodVariants( Method method, + String clientName, Map messageTypes, Map types, - String clientName, Map resourceNames) { List javaMethods = new ArrayList<>(); String methodName = JavaStyle.toLowerCamelCase(method.name()); @@ -564,13 +565,14 @@ private static List createMethodVariants( .setReturnType(methodOutputType) .build(); - String methodSampleCode = ""; + Optional methodSampleCode = Optional.empty(); if (!method.isPaged() && !method.hasLro()) { // TODO(summerji): Remove the condition check once finished the implementation on paged // sample code and lro sample code. methodSampleCode = - ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( - method, signature, types.get(clientName), resourceNames); + Optional.of( + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, signature, types.get(clientName), resourceNames)); } MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java index cdd3ce4a2e..2522f5afa5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientCommentComposer.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -162,7 +163,7 @@ static CommentStatement createCreateMethodStubArgComment( } static List createRpcMethodHeaderComment( - Method method, List methodArguments, String sampleCode) { + Method method, List methodArguments, Optional sampleCode) { JavaDocComment.Builder methodJavadocBuilder = JavaDocComment.builder(); if (method.hasDescription()) { @@ -170,9 +171,9 @@ static List createRpcMethodHeaderComment( processProtobufComment(method.description(), methodJavadocBuilder, null); } - if (!Strings.isNullOrEmpty(sampleCode)) { + if (sampleCode.isPresent()) { methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING); - methodJavadocBuilder.addSampleCode(sampleCode); + methodJavadocBuilder.addSampleCode(sampleCode.get()); } if (methodArguments.isEmpty()) { @@ -199,7 +200,7 @@ static List createRpcMethodHeaderComment( static List createRpcMethodHeaderComment(Method method) { // TODO(summerji): Refactor this method when implement default method sample code. - return createRpcMethodHeaderComment(method, Collections.emptyList(), ""); + return createRpcMethodHeaderComment(method, Collections.emptyList(), Optional.empty()); } static CommentStatement createMethodNoArgComment(String serviceName) { diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 5ade4bd9ae..85d526aee2 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -30,14 +30,15 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class ServiceClientSampleCodeComposer { - // TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer. public static String composeClassHeaderCredentialsSampleCode( // TODO(summerji): Add unit tests for composeClassHeaderCredentialsSampleCode. @@ -185,7 +186,7 @@ public static String composeRpcMethodHeaderSampleCode( List arguments, TypeNode clientType, Map resourceNames) { - // TODO(summerji): Add Other types RPC methods' sample code. + // TODO(summerji): Add other types RPC methods' sample code. return SampleCodeWriter.write( composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames)); } @@ -201,38 +202,88 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) .setType(clientType) .build()); - // Assign each method arguments with its default value. - List methodArgExprs = createMethodArgVarExprs(arguments, resourceNames); - List bodyExpr = - assignMethodArgumentsWithDefaultValues(arguments, methodArgExprs, resourceNames); + // List of rpc method arguments' variable expressions. + List rpcMethodArgVarExprs = + arguments.stream() + .map( + arg -> + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(arg.type()) + .build())) + .collect(Collectors.toList()); + // List of rpc method arguments' default value expression. + List resourceNameList = + resourceNames.values().stream().collect(Collectors.toList()); + List rpcMethodArgDefaultValueExprs = + arguments.stream() + .map( + arg -> + !isStringTypedResourceName(arg, resourceNames) + ? DefaultValueComposer.createDefaultValue(arg, resourceNames) + : MethodInvocationExpr.builder() + .setExprReferenceExpr( + DefaultValueComposer.createDefaultValue( + resourceNames.get( + arg.field().resourceReference().resourceTypeString()), + resourceNameList, + arg.field().name())) + .setMethodName("toString") + .setReturnType(TypeNode.STRING) + .build()) + .collect(Collectors.toList()); + + List bodyExprs = new ArrayList<>(); + Preconditions.checkState( + rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), "Error message here"); + bodyExprs.addAll( + IntStream.range(0, rpcMethodArgVarExprs.size()) + .mapToObj( + i -> + AssignmentExpr.builder() + .setVariableExpr( + ((VariableExpr) rpcMethodArgVarExprs.get(i)) + .toBuilder() + .setIsDecl(true) + .build()) + .setValueExpr(rpcMethodArgDefaultValueExprs.get(i)) + .build()) + .collect(Collectors.toList())); // Invoke current method based on return type. // e.g. if return void, echoClient.echo(..); or, // e.g. if return other type, EchoResponse response = echoClient.echo(...); boolean returnsVoid = isProtoEmptyType(method.outputType()); if (returnsVoid) { - bodyExpr.add( + bodyExprs.add( MethodInvocationExpr.builder() .setExprReferenceExpr(clientVarExpr) .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(methodArgExprs) + .setArguments(rpcMethodArgVarExprs) .setReturnType(clientType) .build()); } else { VariableExpr responseVarExpr = VariableExpr.withVariable( - Variable.builder().setName(RESPONSE).setType(method.outputType()).build()); - bodyExpr.add( - createAssignExprForVariableWithClientMethod( - responseVarExpr, - clientVarExpr, - JavaStyle.toLowerCamelCase(method.name()), - methodArgExprs)); + Variable.builder().setName("response").setType(method.outputType()).build()); + MethodInvocationExpr clientMethodInvocationExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments(rpcMethodArgVarExprs) + .setReturnType(responseVarExpr.variable().type()) + .build(); + bodyExprs.add( + AssignmentExpr.builder() + .setVariableExpr(responseVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(clientMethodInvocationExpr) + .build()); } return TryCatchStatement.builder() .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) .setTryBody( - bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) + bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) .setIsSampleCode(true) .build(); } @@ -255,7 +306,7 @@ private static AssignmentExpr assignClientVariableWithCreateMethodExpr( } // Create a list of Expr for method argument variable expression. - private static List createMethodArgVarExprs( + private static List createRpcMethodArgVarExprs( List arguments, Map resourceNames) { return arguments.stream() .map( @@ -280,64 +331,11 @@ private static List createMethodArgVarExprs( .collect(Collectors.toList()); } - // Return a list of AssignmentExpr for method argument with its default value. - private static List assignMethodArgumentsWithDefaultValues( - List arguments, - List argVarExprs, - Map resourceNames) { - List resourceNameList = - resourceNames.values().stream().collect(Collectors.toList()); - List assignmentExprs = new ArrayList<>(); - for (int i = 0; i < arguments.size(); i++) { - MethodArgument arg = arguments.get(i); - VariableExpr argVarExpr = - (argVarExprs.get(i) instanceof VariableExpr) ? (VariableExpr) argVarExprs.get(i) : null; - Expr defaultValueExpr = DefaultValueComposer.createDefaultValue(arg, resourceNames); - if (arg.type().equals(TypeNode.STRING) - && arg.field().hasResourceReference() - && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString())) { - ResourceName resourceName = - resourceNames.get(arg.field().resourceReference().resourceTypeString()); - defaultValueExpr = - DefaultValueComposer.createDefaultValue( - resourceName, resourceNameList, arg.field().name()); - TypeNode resourceReferenceType = - arg.field().resourceReference().isChildType() - ? TypeNode.withReference( - ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) - : defaultValueExpr.type(); - argVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(arg.name())) - .setType(resourceReferenceType) - .build()); - } - assignmentExprs.add( - AssignmentExpr.builder() - .setVariableExpr(argVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(defaultValueExpr) - .build()); - } - return assignmentExprs; - } - - private static Expr createAssignExprForVariableWithClientMethod( - VariableExpr variableExpr, - VariableExpr clientVarExpr, - String methodName, - List argumentsVarExprs) { - MethodInvocationExpr clientMethodInvocationExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(methodName)) - .setArguments(argumentsVarExprs) - .setReturnType(variableExpr.variable().type()) - .build(); - return AssignmentExpr.builder() - .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(clientMethodInvocationExpr) - .build(); + private static boolean isStringTypedResourceName( + MethodArgument arg, Map resourceNames) { + return arg.type().equals(TypeNode.STRING) + && arg.field().hasResourceReference() + && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString()); } private static boolean isProtoEmptyType(TypeNode type) { diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 46f508110f..1c0a8fdbd5 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -178,8 +178,8 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(name.toString());\n" + + " String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" + + " EchoResponse response = echoClient.echo(name);\n" + "}"; assertEquals(expected, results); } @@ -219,8 +219,8 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(parent.toString());\n" + + " String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" + + " EchoResponse response = echoClient.echo(parent);\n" + "}"; assertEquals(expected, results); } @@ -320,9 +320,9 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = "try (EchoClient echoClient = EchoClient.create()) {\n" - + " ResourceName displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" + " String otherName = \"other_name-182411686\";\n" - + " EchoResponse response = echoClient.echo(displayName.toString(), otherName);\n" + + " EchoResponse response = echoClient.echo(displayName, otherName);\n" + "}"; assertEquals(expected, results); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 2b81181e14..3750febf6c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -244,8 +244,8 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   FoobarName name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
-   *   EchoResponse response = echoClient.echo(name.toString());
+   *   String name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
+   *   EchoResponse response = echoClient.echo(name);
    * }
    * }
* @@ -263,8 +263,8 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   ResourceName parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
-   *   EchoResponse response = echoClient.echo(parent.toString());
+   *   String parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
+   *   EchoResponse response = echoClient.echo(parent);
    * }
    * }
* diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden index ff13c4eea1..ee41579b94 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden @@ -128,10 +128,10 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   ResourceName parent = UserName.of("[USER]");
+   *   String parent = UserName.of("[USER]").toString();
    *   String displayName = "display_name1615086568";
    *   String email = "email96619420";
-   *   User response = identityClient.createUser(parent.toString(), displayName, email);
+   *   User response = identityClient.createUser(parent, displayName, email);
    * }
    * }
* @@ -156,7 +156,7 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   ResourceName parent = UserName.of("[USER]");
+   *   String parent = UserName.of("[USER]").toString();
    *   String displayName = "display_name1615086568";
    *   String email = "email96619420";
    *   int age = 96511;
@@ -165,13 +165,7 @@ public class IdentityClient implements BackgroundResource {
    *   double heightFeet = -1032737338;
    *   User response =
    *       identityClient.createUser(
-   *           parent.toString(),
-   *           displayName,
-   *           email,
-   *           age,
-   *           nickname,
-   *           enableNotifications,
-   *           heightFeet);
+   *           parent, displayName, email, age, nickname, enableNotifications, heightFeet);
    * }
    * }
* @@ -246,8 +240,8 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   UserName name = UserName.of("[USER]");
-   *   User response = identityClient.getUser(name.toString());
+   *   String name = UserName.of("[USER]").toString();
+   *   User response = identityClient.getUser(name);
    * }
    * }
* @@ -315,8 +309,8 @@ public class IdentityClient implements BackgroundResource { * *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
-   *   UserName name = UserName.of("[USER]");
-   *   identityClient.deleteUser(name.toString());
+   *   String name = UserName.of("[USER]").toString();
+   *   identityClient.deleteUser(name);
    * }
    * }
* diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index 0ced58fb60..b9ccab0f57 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -318,8 +318,8 @@ public final Feed getFeed(FeedName name) { * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
-   *   Feed response = assetServiceClient.getFeed(name.toString());
+   *   String name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString();
+   *   Feed response = assetServiceClient.getFeed(name);
    * }
    * }
* @@ -474,8 +474,8 @@ public final void deleteFeed(FeedName name) { * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   FeedName name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]");
-   *   assetServiceClient.deleteFeed(name.toString());
+   *   String name = FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString();
+   *   assetServiceClient.deleteFeed(name);
    * }
    * }
* diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index 5eb1285b1a..3ced45d449 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -508,8 +508,8 @@ public final LogSink getSink(LogSinkName sinkName) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
-   *   LogSink response = configClient.getSink(sinkName.toString());
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   LogSink response = configClient.getSink(sinkName);
    * }
    * }
* @@ -694,9 +694,9 @@ public final LogSink createSink(ProjectName parent, LogSink sink) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   ResourceName parent = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   String parent = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
    *   LogSink sink = LogSink.newBuilder().build();
-   *   LogSink response = configClient.createSink(parent.toString(), sink);
+   *   LogSink response = configClient.createSink(parent, sink);
    * }
    * }
* @@ -791,9 +791,9 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
    *   LogSink sink = LogSink.newBuilder().build();
-   *   LogSink response = configClient.updateSink(sinkName.toString(), sink);
+   *   LogSink response = configClient.updateSink(sinkName, sink);
    * }
    * }
* @@ -875,10 +875,10 @@ public final LogSink updateSink(LogSinkName sinkName, LogSink sink, FieldMask up * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
    *   LogSink sink = LogSink.newBuilder().build();
    *   FieldMask updateMask = FieldMask.newBuilder().build();
-   *   LogSink response = configClient.updateSink(sinkName.toString(), sink, updateMask);
+   *   LogSink response = configClient.updateSink(sinkName, sink, updateMask);
    * }
    * }
* @@ -981,8 +981,8 @@ public final void deleteSink(LogSinkName sinkName) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogSinkName sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]");
-   *   configClient.deleteSink(sinkName.toString());
+   *   String sinkName = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
+   *   configClient.deleteSink(sinkName);
    * }
    * }
* @@ -1173,8 +1173,8 @@ public final LogExclusion getExclusion(LogExclusionName name) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
-   *   LogExclusion response = configClient.getExclusion(name.toString());
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   LogExclusion response = configClient.getExclusion(name);
    * }
    * }
* @@ -1349,9 +1349,10 @@ public final LogExclusion createExclusion(ProjectName parent, LogExclusion exclu * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   ResourceName parent = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   String parent =
+   *       LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
    *   LogExclusion exclusion = LogExclusion.newBuilder().build();
-   *   LogExclusion response = configClient.createExclusion(parent.toString(), exclusion);
+   *   LogExclusion response = configClient.createExclusion(parent, exclusion);
    * }
    * }
* @@ -1442,10 +1443,10 @@ public final LogExclusion updateExclusion( * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
    *   LogExclusion exclusion = LogExclusion.newBuilder().build();
    *   FieldMask updateMask = FieldMask.newBuilder().build();
-   *   LogExclusion response = configClient.updateExclusion(name.toString(), exclusion, updateMask);
+   *   LogExclusion response = configClient.updateExclusion(name, exclusion, updateMask);
    * }
    * }
* @@ -1532,8 +1533,8 @@ public final void deleteExclusion(LogExclusionName name) { * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   LogExclusionName name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]");
-   *   configClient.deleteExclusion(name.toString());
+   *   String name = LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
+   *   configClient.deleteExclusion(name);
    * }
    * }
* diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java index a60142afdc..b9f4814950 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -198,8 +198,8 @@ public final void deleteLog(LogName logName) { * *
{@code
    * try (LoggingClient loggingClient = LoggingClient.create()) {
-   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
-   *   loggingClient.deleteLog(logName.toString());
+   *   String logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]").toString();
+   *   loggingClient.deleteLog(logName);
    * }
    * }
* @@ -327,12 +327,12 @@ public final WriteLogEntriesResponse writeLogEntries( * *
{@code
    * try (LoggingClient loggingClient = LoggingClient.create()) {
-   *   LogName logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]");
+   *   String logName = LogName.ofProjectLogName("[PROJECT]", "[LOG]").toString();
    *   MonitoredResource resource = MonitoredResource.newBuilder().build();
    *   Map labels = new HashMap<>();
    *   List entries = new ArrayList<>();
    *   WriteLogEntriesResponse response =
-   *       loggingClient.writeLogEntries(logName.toString(), resource, labels, entries);
+   *       loggingClient.writeLogEntries(logName, resource, labels, entries);
    * }
    * }
* diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java index f2d1590c3d..7ae9d336af 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -243,8 +243,8 @@ public final LogMetric getLogMetric(LogMetricName metricName) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
-   *   LogMetric response = metricsClient.getLogMetric(metricName.toString());
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   LogMetric response = metricsClient.getLogMetric(metricName);
    * }
    * }
* @@ -317,9 +317,9 @@ public final LogMetric createLogMetric(ProjectName parent, LogMetric metric) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   ResourceName parent = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   String parent = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
    *   LogMetric metric = LogMetric.newBuilder().build();
-   *   LogMetric response = metricsClient.createLogMetric(parent.toString(), metric);
+   *   LogMetric response = metricsClient.createLogMetric(parent, metric);
    * }
    * }
* @@ -396,9 +396,9 @@ public final LogMetric updateLogMetric(LogMetricName metricName, LogMetric metri * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
    *   LogMetric metric = LogMetric.newBuilder().build();
-   *   LogMetric response = metricsClient.updateLogMetric(metricName.toString(), metric);
+   *   LogMetric response = metricsClient.updateLogMetric(metricName, metric);
    * }
    * }
* @@ -470,8 +470,8 @@ public final void deleteLogMetric(LogMetricName metricName) { * *
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   LogMetricName metricName = LogMetricName.of("[PROJECT]", "[METRIC]");
-   *   metricsClient.deleteLogMetric(metricName.toString());
+   *   String metricName = LogMetricName.of("[PROJECT]", "[METRIC]").toString();
+   *   metricsClient.deleteLogMetric(metricName);
    * }
    * }
* diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index b952a9ce37..0aa0479a15 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -318,8 +318,8 @@ public final Instance getInstance(InstanceName name) { * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
-   *   Instance response = cloudRedisClient.getInstance(name.toString());
+   *   String name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]").toString();
+   *   Instance response = cloudRedisClient.getInstance(name);
    * }
    * }
* From 48c308c6ba6d48a7cb0c9d2e9be62ec3706cb79e Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 3 Dec 2020 18:41:50 -0800 Subject: [PATCH 14/32] remove unused method --- .../ServiceClientSampleCodeComposer.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 85d526aee2..d4c3b6d391 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -305,32 +305,6 @@ private static AssignmentExpr assignClientVariableWithCreateMethodExpr( .build(); } - // Create a list of Expr for method argument variable expression. - private static List createRpcMethodArgVarExprs( - List arguments, Map resourceNames) { - return arguments.stream() - .map( - arg -> { - VariableExpr argVarExpr = - VariableExpr.withVariable( - Variable.builder() - .setName(JavaStyle.toLowerCamelCase(arg.name())) - .setType(arg.type()) - .build()); - if (arg.type().equals(TypeNode.STRING) - && arg.field().hasResourceReference() - && resourceNames.containsKey( - arg.field().resourceReference().resourceTypeString())) { - return MethodInvocationExpr.builder() - .setExprReferenceExpr(argVarExpr) - .setMethodName("toString") - .build(); - } - return argVarExpr; - }) - .collect(Collectors.toList()); - } - private static boolean isStringTypedResourceName( MethodArgument arg, Map resourceNames) { return arg.type().equals(TypeNode.STRING) From 9d26694c6fe9efa453d73697e4f9f5212d38224f Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 11:00:41 -0800 Subject: [PATCH 15/32] Add edge case for unit test, and address the comments --- .../ServiceClientSampleCodeComposer.java | 3 +- .../api/generator/gapic/model/GapicClass.java | 2 - .../ServiceClientSampleCodeComposerTest.java | 115 ++++++++++++------ 3 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index d4c3b6d391..33ef275e09 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -236,7 +236,8 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( List bodyExprs = new ArrayList<>(); Preconditions.checkState( - rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), "Error message here"); + rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), + "The method arguments' the number of variable expressions should equal to the number of default value expressions."); bodyExprs.addAll( IntStream.range(0, rpcMethodArgVarExprs.size()) .mapToObj( diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java index 55d538ae60..8ae0376efc 100644 --- a/src/main/java/com/google/api/generator/gapic/model/GapicClass.java +++ b/src/main/java/com/google/api/generator/gapic/model/GapicClass.java @@ -19,8 +19,6 @@ @AutoValue public abstract class GapicClass { - // TODO(miraleung): Clean up the hierarchy to avoid pass another parameter (resourceNames is - // only used for composing sample code). // TODO(miraleung): Add enum for resource name classes. public enum Kind { MAIN, diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 1c0a8fdbd5..edb908d563 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -27,9 +27,11 @@ import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.ResourceReference; import com.google.api.generator.gapic.protoparser.Parser; +import com.google.api.generator.testutils.LineFormatter; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import org.junit.Assert; @@ -88,10 +90,11 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(parent);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n", + " EchoResponse response = echoClient.echo(parent);\n", + "}"); assertEquals(expected, results); } @@ -137,10 +140,11 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(name);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n", + " EchoResponse response = echoClient.echo(name);\n", + "}"); assertEquals(expected, results); } @@ -177,10 +181,11 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" - + " EchoResponse response = echoClient.echo(name);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " EchoResponse response = echoClient.echo(name);\n", + "}"); assertEquals(expected, results); } @@ -218,10 +223,11 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" - + " EchoResponse response = echoClient.echo(parent);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " EchoResponse response = echoClient.echo(parent);\n", + "}"); assertEquals(expected, results); } @@ -262,10 +268,11 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " Status error = Status.newBuilder().build();\n" - + " EchoResponse response = echoClient.echo(error);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " Status error = Status.newBuilder().build();\n", + " EchoResponse response = echoClient.echo(error);\n", + "}"); assertEquals(expected, results); } @@ -319,11 +326,12 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n" - + " String otherName = \"other_name-182411686\";\n" - + " EchoResponse response = echoClient.echo(displayName, otherName);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", + " String otherName = \"other_name-182411686\";\n", + " EchoResponse response = echoClient.echo(displayName, otherName);\n", + "}"); assertEquals(expected, results); } @@ -360,10 +368,11 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String content = \"content951530617\";\n" - + " EchoResponse response = echoClient.echo(content);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String content = \"content951530617\";\n", + " EchoResponse response = echoClient.echo(content);\n", + "}"); assertEquals(expected, results); } @@ -404,11 +413,40 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, signatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String content = \"content951530617\";\n" - + " Severity severity = Severity.forNumber(0);\n" - + " EchoResponse response = echoClient.echo(content, severity);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String content = \"content951530617\";\n", + " Severity severity = Severity.forNumber(0);\n", + " EchoResponse response = echoClient.echo(content, severity);\n", + "}"); + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_noMethodArguments() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + List> signatures = Arrays.asList(Collections.emptyList()); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " EchoResponse response = echoClient.echo();\n", + "}"); assertEquals(expected, results); } @@ -443,10 +481,11 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( unaryMethod, methodSignatures.get(0), clientType, resourceNames)); String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String name = \"name3373707\";\n" - + " echoClient.delete(name);\n" - + "}"; + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " String name = \"name3373707\";\n", + " echoClient.delete(name);\n", + "}"); Assert.assertEquals(results, expected); } } From 77bcf08c099edf2fbdbf7916213787246d12cfe3 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:43:09 -0800 Subject: [PATCH 16/32] rebase master changes --- .../ServiceClientSampleCodeComposerTest.java | 30 ++++++++++++++++++- .../composer/goldens/IdentityClient.golden | 4 +-- .../goldens/library/LibraryServiceClient.java | 8 ++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index edb908d563..961a55d61c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -53,6 +53,34 @@ public void setUp() { resourceNames = Parser.parseResourceNames(echoFileDescriptor); } + @Test + public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + List methodArguments = Collections.emptyList(); + Method method = + Method.builder() + .setName("echo") + .setMethodSignatures(Arrays.asList(methodArguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + String results = + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, methodArguments, clientType, resourceNames); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " EchoResponse response = echoClient.echo();\n", + "}"); + assertEquals(expected, results); + } + @Test public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { TypeNode inputType = @@ -329,7 +357,7 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n", - " String otherName = \"other_name-182411686\";\n", + " String otherName = \"otherName-1946065477\";\n", " EchoResponse response = echoClient.echo(displayName, otherName);\n", "}"); assertEquals(expected, results); diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden index ee41579b94..4ea2ee3319 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden @@ -129,7 +129,7 @@ public class IdentityClient implements BackgroundResource { *
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
    *   String parent = UserName.of("[USER]").toString();
-   *   String displayName = "display_name1615086568";
+   *   String displayName = "displayName1714148973";
    *   String email = "email96619420";
    *   User response = identityClient.createUser(parent, displayName, email);
    * }
@@ -157,7 +157,7 @@ public class IdentityClient implements BackgroundResource {
    * 
{@code
    * try (IdentityClient identityClient = IdentityClient.create()) {
    *   String parent = UserName.of("[USER]").toString();
-   *   String displayName = "display_name1615086568";
+   *   String displayName = "displayName1714148973";
    *   String email = "email96619420";
    *   int age = 96511;
    *   String nickname = "nickname70690926";
diff --git a/test/integration/goldens/library/LibraryServiceClient.java b/test/integration/goldens/library/LibraryServiceClient.java
index 01ee8cf2e6..a87ec39ef7 100644
--- a/test/integration/goldens/library/LibraryServiceClient.java
+++ b/test/integration/goldens/library/LibraryServiceClient.java
@@ -417,7 +417,7 @@ public final Shelf mergeShelves(ShelfName name, ShelfName otherShelfName) {
    * 
{@code
    * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
    *   ShelfName name = ShelfName.of("[SHELF_ID]");
-   *   String otherShelfName = "other_shelf_name145746959";
+   *   String otherShelfName = "otherShelfName-1942963547";
    *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
    * }
    * }
@@ -481,7 +481,7 @@ public final Shelf mergeShelves(String name, ShelfName otherShelfName) { *
{@code
    * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
    *   String name = "name3373707";
-   *   String otherShelfName = "other_shelf_name145746959";
+   *   String otherShelfName = "otherShelfName-1942963547";
    *   Shelf response = libraryServiceClient.mergeShelves(name, otherShelfName);
    * }
    * }
@@ -832,7 +832,7 @@ public final Book moveBook(BookName name, ShelfName otherShelfName) { *
{@code
    * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
    *   BookName name = BookName.of("[SHELF_ID]", "[BOOK_ID]");
-   *   String otherShelfName = "other_shelf_name145746959";
+   *   String otherShelfName = "otherShelfName-1942963547";
    *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
    * }
    * }
@@ -888,7 +888,7 @@ public final Book moveBook(String name, ShelfName otherShelfName) { *
{@code
    * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
    *   String name = "name3373707";
-   *   String otherShelfName = "other_shelf_name145746959";
+   *   String otherShelfName = "otherShelfName-1942963547";
    *   Book response = libraryServiceClient.moveBook(name, otherShelfName);
    * }
    * }
From 50a143e5650a8bb98f757d9e6885daaa56458ee9 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:50:39 -0800 Subject: [PATCH 17/32] fix unit test --- .../gapic/composer/ServiceClientSampleCodeComposerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 961a55d61c..ae7c96dc2f 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -68,7 +68,6 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { .setMethodSignatures(Arrays.asList(methodArguments)) .setInputType(inputType) .setOutputType(outputType) - .setIsPaged(true) .build(); String results = ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( From f43b8503c18cb837687233548ad4662d1d6e10de Mon Sep 17 00:00:00 2001 From: summerji Date: Sat, 5 Dec 2020 17:04:34 -0800 Subject: [PATCH 18/32] Make composeUnaryRpcMethodSampleCode VisibleForTesting --- .../gapic/composer/ServiceClientSampleCodeComposer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 33ef275e09..6b3eba017d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -30,6 +30,7 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Arrays; @@ -191,7 +192,8 @@ public static String composeRpcMethodHeaderSampleCode( composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames)); } - public static TryCatchStatement composeUnaryRpcMethodSampleCode( + @VisibleForTesting + static TryCatchStatement composeUnaryRpcMethodSampleCode( Method method, List arguments, TypeNode clientType, From 425442745755dbb6962928ff4fb57746b04d1dfd Mon Sep 17 00:00:00 2001 From: summerji Date: Mon, 7 Dec 2020 20:51:52 -0800 Subject: [PATCH 19/32] reorder the parameters --- .../composer/ServiceClientClassComposer.java | 2 +- .../ServiceClientSampleCodeComposer.java | 21 ++++--- .../ServiceClientSampleCodeComposerTest.java | 58 ++++++++++++++----- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 3e7a2280f4..97982a32c4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -572,7 +572,7 @@ private static List createMethodVariants( methodSampleCode = Optional.of( ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( - method, signature, types.get(clientName), resourceNames)); + method, types.get(clientName), signature, resourceNames)); } MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index 6b3eba017d..b009d079c4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -184,19 +184,19 @@ public static String composeClassHeaderEndpointSampleCode( public static String composeRpcMethodHeaderSampleCode( Method method, - List arguments, TypeNode clientType, + List arguments, Map resourceNames) { // TODO(summerji): Add other types RPC methods' sample code. return SampleCodeWriter.write( - composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames)); + composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames)); } @VisibleForTesting static TryCatchStatement composeUnaryRpcMethodSampleCode( Method method, - List arguments, TypeNode clientType, + List arguments, Map resourceNames) { VariableExpr clientVarExpr = VariableExpr.withVariable( @@ -205,7 +205,7 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode( .setType(clientType) .build()); // List of rpc method arguments' variable expressions. - List rpcMethodArgVarExprs = + List rpcMethodArgVarExprs = arguments.stream() .map( arg -> @@ -239,17 +239,14 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode( List bodyExprs = new ArrayList<>(); Preconditions.checkState( rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), - "The method arguments' the number of variable expressions should equal to the number of default value expressions."); + "Expected the number of method arguments to match the number of default values."); bodyExprs.addAll( IntStream.range(0, rpcMethodArgVarExprs.size()) .mapToObj( i -> AssignmentExpr.builder() .setVariableExpr( - ((VariableExpr) rpcMethodArgVarExprs.get(i)) - .toBuilder() - .setIsDecl(true) - .build()) + (rpcMethodArgVarExprs.get(i)).toBuilder().setIsDecl(true).build()) .setValueExpr(rpcMethodArgDefaultValueExprs.get(i)) .build()) .collect(Collectors.toList())); @@ -262,7 +259,8 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode( MethodInvocationExpr.builder() .setExprReferenceExpr(clientVarExpr) .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(rpcMethodArgVarExprs) + .setArguments( + rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList())) .setReturnType(clientType) .build()); } else { @@ -273,7 +271,8 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode( MethodInvocationExpr.builder() .setExprReferenceExpr(clientVarExpr) .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(rpcMethodArgVarExprs) + .setArguments( + rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList())) .setReturnType(responseVarExpr.variable().type()) .build(); bodyExprs.add( diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index ae7c96dc2f..15c05b4c25 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -40,9 +40,6 @@ public class ServiceClientSampleCodeComposerTest { private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; - private static final TypeNode clientType = - TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); FileDescriptor echoFileDescriptor; Map resourceNames; @@ -55,6 +52,9 @@ public void setUp() { @Test public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -71,7 +71,7 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { .build(); String results = ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( - method, methodArguments, clientType, resourceNames); + method, clientType, methodArguments, resourceNames); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -82,6 +82,9 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { @Test public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -115,7 +118,7 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -127,6 +130,9 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -165,7 +171,7 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -177,6 +183,9 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr @Test public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -206,7 +215,7 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -218,6 +227,9 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg @Test public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -248,7 +260,7 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -260,6 +272,9 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet @Test public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -293,7 +308,7 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -305,6 +320,9 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -351,7 +369,7 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -364,6 +382,9 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -393,7 +414,7 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -405,6 +426,9 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume @Test public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -438,7 +462,7 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -451,6 +475,9 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { @Test public void composeUnaryRpcMethodSampleCode_noMethodArguments() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); @@ -468,7 +495,7 @@ public void composeUnaryRpcMethodSampleCode_noMethodArguments() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, signatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -479,6 +506,9 @@ public void composeUnaryRpcMethodSampleCode_noMethodArguments() { @Test public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder() @@ -506,7 +536,7 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { String results = SampleCodeWriter.write( ServiceClientSampleCodeComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, methodSignatures.get(0), clientType, resourceNames)); + unaryMethod, clientType, methodSignatures.get(0), resourceNames)); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", From f43fa63e271ad5ce353d95ea1947acda466bb5d5 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 8 Dec 2020 16:29:15 -0800 Subject: [PATCH 20/32] update unit test --- .../ServiceClientSampleCodeComposerTest.java | 196 ++++++++++++++---- 1 file changed, 151 insertions(+), 45 deletions(-) diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 15c05b4c25..384f2d97c1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -35,32 +35,33 @@ import java.util.List; import java.util.Map; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; public class ServiceClientSampleCodeComposerTest { - private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; - - FileDescriptor echoFileDescriptor; - Map resourceNames; - - @Before - public void setUp() { - echoFileDescriptor = EchoOuterClass.getDescriptor(); - resourceNames = Parser.parseResourceNames(echoFileDescriptor); - } + private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1"; @Test public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); List methodArguments = Collections.emptyList(); Method method = Method.builder() @@ -82,15 +83,26 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { @Test public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode resourceNameType = TypeNode.withReference( ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)); @@ -130,20 +142,31 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode methodArgType = TypeNode.withReference( VaporReference.builder() .setName("FoobarName") - .setPakkage(PACKAGE_NAME) + .setPakkage(SHOWCASE_PACKAGE_NAME) .setSupertypeReference( ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) .build()); @@ -183,15 +206,26 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr @Test public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); Field methodArgField = Field.builder() .setName("name") @@ -227,15 +261,26 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg @Test public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); Field methodArgField = Field.builder() .setName("parent") @@ -272,15 +317,26 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet @Test public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode methodArgType = TypeNode.withReference( VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); @@ -320,15 +376,26 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); Field methodArgField = Field.builder() .setName("display_name") @@ -336,7 +403,8 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { .setResourceReference( ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) .build(); - Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); + Reference userRef = + VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build(); Field nestFiled = Field.builder() .setName("user") @@ -382,15 +450,26 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { @Test public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); Field methodArgField = Field.builder() .setName("content") @@ -426,15 +505,26 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume @Test public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); MethodArgument arg1 = MethodArgument.builder() .setName("content") @@ -443,7 +533,7 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { .build(); TypeNode severityType = TypeNode.withReference( - VaporReference.builder().setName("Severity").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder().setName("Severity").setPakkage(SHOWCASE_PACKAGE_NAME).build()); MethodArgument arg2 = MethodArgument.builder() .setName("severity") @@ -475,15 +565,26 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { @Test public void composeUnaryRpcMethodSampleCode_noMethodArguments() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode outputType = TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); List> signatures = Arrays.asList(Collections.emptyList()); Method unaryMethod = Method.builder() @@ -506,9 +607,14 @@ public void composeUnaryRpcMethodSampleCode_noMethodArguments() { @Test public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); TypeNode inputType = TypeNode.withReference( VaporReference.builder() From 443404a1ae7281dc8306a382618eabf521db90a9 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 17:21:08 -0800 Subject: [PATCH 21/32] Implement Pure Unary RPC sample code --- .../MethodSampleCodeHelperComposer.java | 167 +++++++ .../MethodSampleCodeHelperComposerTest.java | 454 ++++++++++++++++++ 2 files changed, 621 insertions(+) create mode 100644 src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java create mode 100644 src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java new file mode 100644 index 0000000000..ec2e4e9c19 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java @@ -0,0 +1,167 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer; + +import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.Expr; +import com.google.api.generator.engine.ast.ExprStatement; +import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.TryCatchStatement; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.Variable; +import com.google.api.generator.engine.ast.VariableExpr; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.utils.JavaStyle; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class MethodSampleCodeHelperComposer { + private static String RESPONSE = "response"; + + public static TryCatchStatement composeUnaryRpcMethodSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames) { + VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); + // Assign each method arguments with its default value. + Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); + List methodArgumentsAssignmentExpr = + assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); + List methodVarExprs = + arguments.stream() + .map(arg -> methodArgVarExprMap.get(arg.name())) + .collect(Collectors.toList()); + // Invoke current method based on return type. + // e.g. if return void, echoClient.echo(..); or, + // e.g. if return other type, EchoResponse response = echoClient.echo(...); + boolean returnsVoid = isProtoEmptyType(method.outputType()); + Expr responseExpr = null; + if (returnsVoid) { + responseExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments(methodVarExprs) + .setReturnType(clientType) + .build(); + } else { + responseExpr = + createAssignExprForVariableWithClientMethod( + createVariableExpr(RESPONSE, method.outputType()), + clientVarExpr, + JavaStyle.toLowerCamelCase(method.name()), + methodVarExprs); + } + + List bodyExpr = new ArrayList<>(); + bodyExpr.addAll(methodArgumentsAssignmentExpr); + bodyExpr.add(responseExpr); + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody( + bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) + .setIsSampleCode(true) + .build(); + } + + // ==================================Helpers===================================================// + + // Assign client variable expr with create client. + // e.g EchoClient echoClient = EchoClient.create() + private static AssignmentExpr assignClientVariableWithCreateMethodExpr( + VariableExpr clientVarExpr) { + return AssignmentExpr.builder() + .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType(clientVarExpr.variable().type()) + .setReturnType(clientVarExpr.variable().type()) + .setMethodName("create") + .build()) + .build(); + } + + // Create a Map where key is method's argument name, and value is its VariableExpr. + private static Map createMethodArgumentsVariableExprs( + List arguments) { + return arguments.stream() + .collect( + Collectors.toMap( + methodArg -> methodArg.name(), + methodArg -> + createVariableExpr( + JavaStyle.toLowerCamelCase(methodArg.name()), methodArg.type()))); + } + + // Return a list of AssignmentExpr for method argument with its default value. + private static List assignMethodArgumentsWithDefaultValues( + List arguments, + Map argVarExprs, + Map resourceNames) { + return arguments.stream() + .map( + arg -> + createAssignmentExpr( + argVarExprs.get(arg.name()), + DefaultValueComposer.createDefaultValue(arg, resourceNames))) + .collect(Collectors.toList()); + } + + private static Expr createAssignExprForVariableWithClientMethod( + VariableExpr variableExpr, + VariableExpr clientVarExpr, + String methodName, + List argumentsVarExprs) { + MethodInvocationExpr clientMethodInvocationExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(methodName)) + .setArguments(argumentsVarExprs) + .setReturnType(variableExpr.variable().type()) + .build(); + return AssignmentExpr.builder() + .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(clientMethodInvocationExpr) + .build(); + } + + private static String getClientName(TypeNode clientType) { + return JavaStyle.toLowerCamelCase(clientType.reference().name()); + } + + private static boolean isProtoEmptyType(TypeNode type) { + return type.reference().pakkage().equals("com.google.protobuf") + && type.reference().name().equals("Empty"); + } + + private static AssignmentExpr createAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { + return AssignmentExpr.builder() + .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(valueExpr) + .build(); + } + + private static VariableExpr createVariableExpr(String variableName, TypeNode type) { + return VariableExpr.builder() + .setVariable(Variable.builder().setName(variableName).setType(type).build()) + .build(); + } +} diff --git a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java new file mode 100644 index 0000000000..152152b5bd --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java @@ -0,0 +1,454 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.api.generator.gapic.composer; + +import static junit.framework.Assert.assertEquals; + +import com.google.api.generator.engine.ast.ConcreteReference; +import com.google.api.generator.engine.ast.Reference; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.VaporReference; +import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Field; +import com.google.api.generator.gapic.model.Method; +import com.google.api.generator.gapic.model.MethodArgument; +import com.google.api.generator.gapic.model.ResourceName; +import com.google.api.generator.gapic.model.ResourceReference; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class MethodSampleCodeHelperComposerTest { + private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; + private static final TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); + Map resourceNames = new HashMap<>(); + + @Before + public void setUp() { + ResourceName foobarResourceName = + ResourceName.builder() + .setVariableName("foobar") + .setPakkage(PACKAGE_NAME) + .setResourceTypeString("showcase.googleapis.com/Foobar") + .setPatterns( + Arrays.asList( + "projects/{project}/foobars/{foobar}", + "projects/{project}/chocolate/variants/{variant}/foobars/{foobar}", + "foobars/{foobar}", + "bar_foo/{bar_foo}/foobars/{foobar}")) + .setParentMessageName("Foobar") + .build(); + ResourceName anythingGoesResourceName = + ResourceName.createWildcard("showcase.googleapis.com/AnythingGoes", PACKAGE_NAME); + resourceNames.put("showcase.googleapis.com/Foobar", foobarResourceName); + resourceNames.put("showcase.googleapis.com/AnythingGoes", anythingGoesResourceName); + } + + @Test + public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode resourceNameType = + TypeNode.withReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(resourceNameType) + .setField( + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withType("showcase.googleapis.com/AnythingGoes")) + .build()) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(parent);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); + Field methodArgField = + Field.builder() + .setName("error") + .setType(methodArgType) + .setIsMessage(true) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("error") + .setType(methodArgType) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " Status error = Status.newBuilder().build();\n" + + " EchoResponse response = echoClient.echo(error);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + TypeNode methodArgType = + TypeNode.withReference( + VaporReference.builder() + .setName("FoobarName") + .setPakkage(PACKAGE_NAME) + .setSupertypeReference( + ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) + .build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(methodArgType) + .setField(methodArgField) + .setIsResourceNameHelper(true) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" + + " EchoResponse response = echoClient.echo(name);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("content") + .setType(TypeNode.STRING) + .setIsContainedInOneof(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String content = \"content951530617\";\n" + + " EchoResponse response = echoClient.echo(content);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_strinWithResourceReferenceMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("name") + .setType(TypeNode.STRING) + .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String name = \"name3373707\";\n" + + " EchoResponse response = echoClient.echo(name);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("parent") + .setType(TypeNode.STRING) + .setField(methodArgField) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String parent = \"parent-995424086\";\n" + + " EchoResponse response = echoClient.echo(parent);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + Field methodArgField = + Field.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setResourceReference( + ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) + .build(); + Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); + Field nestFiled = + Field.builder() + .setName("user") + .setType(TypeNode.withReference(userRef)) + .setIsMessage(true) + .build(); + MethodArgument arg = + MethodArgument.builder() + .setName("display_name") + .setType(TypeNode.STRING) + .setField(methodArgField) + .setNestedFields(Arrays.asList(nestFiled)) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String displayName = \"display_name1615086568\";\n" + + " EchoResponse response = echoClient.echo(displayName);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); + MethodArgument arg1 = + MethodArgument.builder() + .setName("content") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("content").setType(TypeNode.STRING).build()) + .build(); + TypeNode severityType = + TypeNode.withReference( + VaporReference.builder().setName("Severity").setPakkage(PACKAGE_NAME).build()); + MethodArgument arg2 = + MethodArgument.builder() + .setName("severity") + .setType(severityType) + .setField( + Field.builder().setName("severity").setType(severityType).setIsEnum(true).build()) + .build(); + List> signatures = Arrays.asList(Arrays.asList(arg1, arg2)); + Method unaryMethod = + Method.builder() + .setName("echo") + .setMethodSignatures(signatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, signatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String content = \"content951530617\";\n" + + " Severity severity = Severity.forNumber(0);\n" + + " EchoResponse response = echoClient.echo(content, severity);\n" + + "}"; + assertEquals(expected, results); + } + + @Test + public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("DeleteUserRequest") + .setPakkage("com.google.showcase.v1beta1") + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("Empty").setPakkage("com.google.protobuf").build()); + List> methodSignatures = + Arrays.asList( + Arrays.asList( + MethodArgument.builder() + .setName("name") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("name").setType(TypeNode.STRING).build()) + .build())); + Method unaryMethod = + Method.builder() + .setName("delete") + .setMethodSignatures(methodSignatures) + .setInputType(inputType) + .setOutputType(outputType) + .build(); + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( + unaryMethod, methodSignatures.get(0), clientType, resourceNames)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " String name = \"name3373707\";\n" + + " echoClient.delete(name);\n" + + "}"; + Assert.assertEquals(results, expected); + } +} From 55d2f42341373dc7bf2bad4c978b3517b9ec89f9 Mon Sep 17 00:00:00 2001 From: summerji Date: Sun, 29 Nov 2020 16:39:57 -0800 Subject: [PATCH 22/32] Implemente Unary Paged RPC method's sample code --- .../MethodSampleCodeHelperComposer.java | 70 ++++++++ .../composer/ServiceClientClassComposer.java | 4 +- .../MethodSampleCodeHelperComposerTest.java | 66 +++++++ .../goldens/asset/AssetServiceClient.java | 27 +++ .../goldens/library/LibraryServiceClient.java | 22 +++ .../goldens/logging/ConfigClient.java | 166 ++++++++++++++++++ .../goldens/logging/LoggingClient.java | 69 ++++++++ .../goldens/logging/MetricsClient.java | 22 +++ .../goldens/redis/CloudRedisClient.java | 22 +++ 9 files changed, 466 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java index ec2e4e9c19..6e1faa742b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java @@ -15,9 +15,13 @@ package com.google.api.generator.gapic.composer; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; +import com.google.api.generator.engine.ast.ForStatement; +import com.google.api.generator.engine.ast.LineComment; import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.Statement; import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.engine.ast.Variable; @@ -27,6 +31,7 @@ import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -82,6 +87,49 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode( .build(); } + public static TryCatchStatement composeUnaryPagedRpcMethodSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames, + TypeNode pagedItemType) { + VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); + // Assign each method arguments with its default value. + Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); + List methodArgumentsAssignmentExpr = + assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); + List methodArgVarExprs = + arguments.stream() + .map(arg -> methodArgVarExprMap.get(arg.name())) + .collect(Collectors.toList()); + // For loop client on iterateAll method. + // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) { + // //doThingsWith(element); + // } + VariableExpr elementVarExpr = createVariableExpr("element", pagedItemType); + Expr clientMethodIterateAllExpr = + createClientMethodIteratorAllExpr( + clientVarExpr, method.name(), methodArgVarExprs, pagedItemType); + ForStatement loopIteratorStatement = + ForStatement.builder() + .setLocalVariableExpr(elementVarExpr.toBuilder().setIsDecl(true).build()) + .setCollectionExpr(clientMethodIterateAllExpr) + .setBody(Arrays.asList(createLineCommentStatement("doThingsWith(element);"))) + .build(); + + List bodyExpr = new ArrayList<>(); + bodyExpr.addAll(methodArgumentsAssignmentExpr); + List bodyStatements = + bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()); + bodyStatements.add(loopIteratorStatement); + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody(bodyStatements) + .setIsSampleCode(true) + .build(); + } + // ==================================Helpers===================================================// // Assign client variable expr with create client. @@ -143,6 +191,24 @@ private static Expr createAssignExprForVariableWithClientMethod( .build(); } + private static Expr createClientMethodIteratorAllExpr( + VariableExpr clientVarExpr, + String methodName, + List methodArgVarExprs, + TypeNode pagedItemType) { + MethodInvocationExpr clientMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(methodName)) + .setArguments(methodArgVarExprs) + .build(); + return MethodInvocationExpr.builder() + .setExprReferenceExpr(clientMethodExpr) + .setMethodName("iterateAll") + .setReturnType(pagedItemType) + .build(); + } + private static String getClientName(TypeNode clientType) { return JavaStyle.toLowerCamelCase(clientType.reference().name()); } @@ -152,6 +218,10 @@ private static boolean isProtoEmptyType(TypeNode type) { && type.reference().name().equals("Empty"); } + private static CommentStatement createLineCommentStatement(String content) { + return CommentStatement.withComment(LineComment.withComment(content)); + } + private static AssignmentExpr createAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { return AssignmentExpr.builder() .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 97982a32c4..a83e922f46 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -480,11 +480,11 @@ private static List createServiceMethods( Map types, Map resourceNames) { List javaMethods = new ArrayList<>(); + String clientName = getClientClassName(service); for (Method method : service.methods()) { if (method.stream().equals(Stream.NONE)) { javaMethods.addAll( - createMethodVariants( - method, getClientClassName(service), messageTypes, types, resourceNames)); + createMethodVariants(method, messageTypes, types, clientName, resourceNames)); javaMethods.add(createMethodDefaultMethod(method, types)); } if (method.hasLro()) { diff --git a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java index 152152b5bd..48767125cf 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java @@ -62,6 +62,7 @@ public void setUp() { resourceNames.put("showcase.googleapis.com/AnythingGoes", anythingGoesResourceName); } + // ==========================================Unary RPC Method Sample Code=======================// @Test public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { TypeNode inputType = @@ -451,4 +452,69 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { + "}"; Assert.assertEquals(results, expected); } + + // ===================================Unary Paged RPC Method Sample Code ======================// + @Test + public void composeUnaryPagedRpcMethodSampleCode() { + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentRequest") + .setPakkage(PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentResponse") + .setPakkage(PACKAGE_NAME) + .build()); + TypeNode resourceNameType = + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(List.class) + .setGenerics(ConcreteReference.withClazz(String.class)) + .build()); + List arguments = + Arrays.asList( + MethodArgument.builder() + .setName("resourceName") + .setType(resourceNameType) + .setField( + Field.builder() + .setName("resourceName") + .setType(resourceNameType) + .setIsRepeated(true) + .build()) + .build(), + MethodArgument.builder() + .setName("filter") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("filter").setType(TypeNode.STRING).build()) + .build()); + Method method = + Method.builder() + .setName("ListContent") + .setMethodSignatures(Arrays.asList(arguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + TypeNode pagedItemType = + TypeNode.withReference( + VaporReference.builder().setName("Content").setPakkage(PACKAGE_NAME).build()); + + String results = + SampleCodeWriter.write( + MethodSampleCodeHelperComposer.composeUnaryPagedRpcMethodSampleCode( + method, arguments, clientType, resourceNames, pagedItemType)); + String expected = + "try (EchoClient echoClient = EchoClient.create()) {\n" + + " List resourceName = new ArrayList<>();\n" + + " String filter = \"filter-1274492040\";\n" + + " for (Content element : echoClient.listContent(resourceName, filter).iterateAll()) {\n" + + " // doThingsWith(element);\n" + + " }\n" + + "}"; + Assert.assertEquals(results, expected); + } } diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index b9ccab0f57..7a1fa9048c 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -516,6 +516,20 @@ public final UnaryCallable deleteFeedCallable() { * organization. The caller must be granted the `cloudasset.assets.searchAllResources` permission * on the desired scope, otherwise the request will be rejected. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String scope = "scope109264468";
+   *   String query = "query107944136";
+   *   List assetTypes = new ArrayList<>();
+   *   for (ResourceSearchResult element :
+   *       assetServiceClient.searchAllResources(scope, query, assetTypes).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param scope Required. A scope can be a project, a folder, or an organization. The search is * limited to the resources within the `scope`. The caller must be granted the * [`cloudasset.assets.searchAllResources`](http://cloud.google.com/asset-inventory/docs/access-control#required_permissions) @@ -622,6 +636,19 @@ public final SearchAllResourcesPagedResponse searchAllResources( * organization. The caller must be granted the `cloudasset.assets.searchAllIamPolicies` * permission on the desired scope, otherwise the request will be rejected. * + *

Sample code: + * + *

{@code
+   * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
+   *   String scope = "scope109264468";
+   *   String query = "query107944136";
+   *   for (IamPolicySearchResult element :
+   *       assetServiceClient.searchAllIamPolicies(scope, query).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param scope Required. A scope can be a project, a folder, or an organization. The search is * limited to the IAM policies within the `scope`. The caller must be granted the * [`cloudasset.assets.searchAllIamPolicies`](http://cloud.google.com/asset-inventory/docs/access-control#required_permissions) diff --git a/test/integration/goldens/library/LibraryServiceClient.java b/test/integration/goldens/library/LibraryServiceClient.java index a87ec39ef7..1631fc13cc 100644 --- a/test/integration/goldens/library/LibraryServiceClient.java +++ b/test/integration/goldens/library/LibraryServiceClient.java @@ -668,6 +668,17 @@ public final UnaryCallable getBookCallable() { * not necessarily be added to the end of this list. Returns NOT_FOUND if the shelf does not * exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   ShelfName name = ShelfName.of("[SHELF_ID]");
+   *   for (Book element : libraryServiceClient.listBooks(name).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param name The name of the shelf whose books we'd like to list. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ @@ -683,6 +694,17 @@ public final ListBooksPagedResponse listBooks(ShelfName name) { * not necessarily be added to the end of this list. Returns NOT_FOUND if the shelf does not * exist. * + *

Sample code: + * + *

{@code
+   * try (LibraryServiceClient libraryServiceClient = LibraryServiceClient.create()) {
+   *   String name = "name3373707";
+   *   for (Book element : libraryServiceClient.listBooks(name).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param name The name of the shelf whose books we'd like to list. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index 3ced45d449..2e79c2fcfa 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -176,6 +176,18 @@ public ConfigServiceV2Stub getStub() { /** * Lists buckets (Beta). * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountLocationName parent =
+   *       BillingAccountLocationName.of("[BILLING_ACCOUNT]", "[LOCATION]");
+   *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose buckets are to be listed: *

"projects/[PROJECT_ID]/locations/[LOCATION_ID]" * "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]" @@ -197,6 +209,17 @@ public final ListBucketsPagedResponse listBuckets(BillingAccountLocationName par /** * Lists buckets (Beta). * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderLocationName parent = FolderLocationName.of("[FOLDER]", "[LOCATION]");
+   *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose buckets are to be listed: *

"projects/[PROJECT_ID]/locations/[LOCATION_ID]" * "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]" @@ -218,6 +241,17 @@ public final ListBucketsPagedResponse listBuckets(FolderLocationName parent) { /** * Lists buckets (Beta). * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   LocationName parent = LocationName.of("[PROJECT]", "[LOCATION]");
+   *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose buckets are to be listed: *

"projects/[PROJECT_ID]/locations/[LOCATION_ID]" * "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]" @@ -239,6 +273,17 @@ public final ListBucketsPagedResponse listBuckets(LocationName parent) { /** * Lists buckets (Beta). * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationLocationName parent = OrganizationLocationName.of("[ORGANIZATION]", "[LOCATION]");
+   *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose buckets are to be listed: *

"projects/[PROJECT_ID]/locations/[LOCATION_ID]" * "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]" @@ -260,6 +305,17 @@ public final ListBucketsPagedResponse listBuckets(OrganizationLocationName paren /** * Lists buckets (Beta). * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose buckets are to be listed: *

"projects/[PROJECT_ID]/locations/[LOCATION_ID]" * "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]" @@ -370,6 +426,17 @@ public final UnaryCallable updateBucketCallable( /** * Lists sinks. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose sinks are to be listed: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -385,6 +452,17 @@ public final ListSinksPagedResponse listSinks(BillingAccountName parent) { /** * Lists sinks. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose sinks are to be listed: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -400,6 +478,17 @@ public final ListSinksPagedResponse listSinks(FolderName parent) { /** * Lists sinks. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose sinks are to be listed: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -415,6 +504,17 @@ public final ListSinksPagedResponse listSinks(OrganizationName parent) { /** * Lists sinks. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose sinks are to be listed: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -430,6 +530,17 @@ public final ListSinksPagedResponse listSinks(ProjectName parent) { /** * Lists sinks. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose sinks are to be listed: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1027,6 +1138,17 @@ public final UnaryCallable deleteSinkCallable() { /** * Lists all the exclusions in a parent resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose exclusions are to be listed. *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1044,6 +1166,17 @@ public final ListExclusionsPagedResponse listExclusions(BillingAccountName paren /** * Lists all the exclusions in a parent resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose exclusions are to be listed. *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1061,6 +1194,17 @@ public final ListExclusionsPagedResponse listExclusions(FolderName parent) { /** * Lists all the exclusions in a parent resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose exclusions are to be listed. *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1078,6 +1222,17 @@ public final ListExclusionsPagedResponse listExclusions(OrganizationName parent) /** * Lists all the exclusions in a parent resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose exclusions are to be listed. *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -1095,6 +1250,17 @@ public final ListExclusionsPagedResponse listExclusions(ProjectName parent) { /** * Lists all the exclusions in a parent resource. * + *

Sample code: + * + *

{@code
+   * try (ConfigClient configClient = ConfigClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The parent resource whose exclusions are to be listed. *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java index b9f4814950..f70230e871 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -425,6 +425,20 @@ public final WriteLogEntriesResponse writeLogEntries(WriteLogEntriesRequest requ * project/folder/organization/billing account. For ways to export log entries, see [Exporting * Logs](https://cloud.google.com/logging/docs/export). * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   List resourceNames = new ArrayList<>();
+   *   String filter = "filter-1274492040";
+   *   String orderBy = "order_by1234304744";
+   *   for (LogEntry element :
+   *       loggingClient.listLogEntries(resourceNames, filter, orderBy).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param resource_names Required. Names of one or more parent resources from which to retrieve * log entries: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" @@ -534,6 +548,17 @@ public final ListMonitoredResourceDescriptorsPagedResponse listMonitoredResource * Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have * entries are listed. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   BillingAccountName parent = BillingAccountName.of("[BILLING_ACCOUNT]");
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name that owns the logs: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -550,6 +575,17 @@ public final ListLogsPagedResponse listLogs(BillingAccountName parent) { * Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have * entries are listed. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   FolderName parent = FolderName.of("[FOLDER]");
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name that owns the logs: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -566,6 +602,17 @@ public final ListLogsPagedResponse listLogs(FolderName parent) { * Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have * entries are listed. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   OrganizationName parent = OrganizationName.of("[ORGANIZATION]");
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name that owns the logs: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -582,6 +629,17 @@ public final ListLogsPagedResponse listLogs(OrganizationName parent) { * Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have * entries are listed. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name that owns the logs: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" @@ -598,6 +656,17 @@ public final ListLogsPagedResponse listLogs(ProjectName parent) { * Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have * entries are listed. * + *

Sample code: + * + *

{@code
+   * try (LoggingClient loggingClient = LoggingClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name that owns the logs: *

"projects/[PROJECT_ID]" "organizations/[ORGANIZATION_ID]" * "billingAccounts/[BILLING_ACCOUNT_ID]" "folders/[FOLDER_ID]" diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java index 7ae9d336af..1e9ad1a745 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -152,6 +152,17 @@ public MetricsServiceV2Stub getStub() { /** * Lists logs-based metrics. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   ProjectName parent = ProjectName.of("[PROJECT]");
+   *   for (LogMetric element : metricsClient.listLogMetrics(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The name of the project containing the metrics: *

"projects/[PROJECT_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -168,6 +179,17 @@ public final ListLogMetricsPagedResponse listLogMetrics(ProjectName parent) { /** * Lists logs-based metrics. * + *

Sample code: + * + *

{@code
+   * try (MetricsClient metricsClient = MetricsClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (LogMetric element : metricsClient.listLogMetrics(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The name of the project containing the metrics: *

"projects/[PROJECT_ID]" * @throws com.google.api.gax.rpc.ApiException if the remote call fails diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index 0aa0479a15..c97f8f0d9d 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -189,6 +189,17 @@ public final OperationsClient getOperationsClient() { *

If `location_id` is specified as `-` (wildcard), then all regions available to the project * are queried, and the results are aggregated. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   LocationName parent = LocationName.of("[PROJECT]", "[LOCATION]");
+   *   for (Instance element : cloudRedisClient.listInstances(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name of the instance location using the form: * `projects/{project_id}/locations/{location_id}` where `location_id` refers to a GCP region. * @throws com.google.api.gax.rpc.ApiException if the remote call fails @@ -215,6 +226,17 @@ public final ListInstancesPagedResponse listInstances(LocationName parent) { *

If `location_id` is specified as `-` (wildcard), then all regions available to the project * are queried, and the results are aggregated. * + *

Sample code: + * + *

{@code
+   * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
+   *   String parent = "parent-995424086";
+   *   for (Instance element : cloudRedisClient.listInstances(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @param parent Required. The resource name of the instance location using the form: * `projects/{project_id}/locations/{location_id}` where `location_id` refers to a GCP region. * @throws com.google.api.gax.rpc.ApiException if the remote call fails From b8a9f00ca6d5544443b1827ac6f2f0aaecd387de Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:17:14 -0800 Subject: [PATCH 23/32] rebase previous PR and address the comments --- .../MethodSampleCodeHelperComposer.java | 237 -------- .../MethodSampleCodeHelperComposerTest.java | 520 ------------------ 2 files changed, 757 deletions(-) delete mode 100644 src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java delete mode 100644 src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java diff --git a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java deleted file mode 100644 index 6e1faa742b..0000000000 --- a/src/main/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposer.java +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.api.generator.gapic.composer; - -import com.google.api.generator.engine.ast.AssignmentExpr; -import com.google.api.generator.engine.ast.CommentStatement; -import com.google.api.generator.engine.ast.Expr; -import com.google.api.generator.engine.ast.ExprStatement; -import com.google.api.generator.engine.ast.ForStatement; -import com.google.api.generator.engine.ast.LineComment; -import com.google.api.generator.engine.ast.MethodInvocationExpr; -import com.google.api.generator.engine.ast.Statement; -import com.google.api.generator.engine.ast.TryCatchStatement; -import com.google.api.generator.engine.ast.TypeNode; -import com.google.api.generator.engine.ast.Variable; -import com.google.api.generator.engine.ast.VariableExpr; -import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.MethodArgument; -import com.google.api.generator.gapic.model.ResourceName; -import com.google.api.generator.gapic.utils.JavaStyle; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class MethodSampleCodeHelperComposer { - private static String RESPONSE = "response"; - - public static TryCatchStatement composeUnaryRpcMethodSampleCode( - Method method, - List arguments, - TypeNode clientType, - Map resourceNames) { - VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); - // Assign each method arguments with its default value. - Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); - List methodArgumentsAssignmentExpr = - assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); - List methodVarExprs = - arguments.stream() - .map(arg -> methodArgVarExprMap.get(arg.name())) - .collect(Collectors.toList()); - // Invoke current method based on return type. - // e.g. if return void, echoClient.echo(..); or, - // e.g. if return other type, EchoResponse response = echoClient.echo(...); - boolean returnsVoid = isProtoEmptyType(method.outputType()); - Expr responseExpr = null; - if (returnsVoid) { - responseExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(method.name())) - .setArguments(methodVarExprs) - .setReturnType(clientType) - .build(); - } else { - responseExpr = - createAssignExprForVariableWithClientMethod( - createVariableExpr(RESPONSE, method.outputType()), - clientVarExpr, - JavaStyle.toLowerCamelCase(method.name()), - methodVarExprs); - } - - List bodyExpr = new ArrayList<>(); - bodyExpr.addAll(methodArgumentsAssignmentExpr); - bodyExpr.add(responseExpr); - - return TryCatchStatement.builder() - .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) - .setTryBody( - bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList())) - .setIsSampleCode(true) - .build(); - } - - public static TryCatchStatement composeUnaryPagedRpcMethodSampleCode( - Method method, - List arguments, - TypeNode clientType, - Map resourceNames, - TypeNode pagedItemType) { - VariableExpr clientVarExpr = createVariableExpr(getClientName(clientType), clientType); - // Assign each method arguments with its default value. - Map methodArgVarExprMap = createMethodArgumentsVariableExprs(arguments); - List methodArgumentsAssignmentExpr = - assignMethodArgumentsWithDefaultValues(arguments, methodArgVarExprMap, resourceNames); - List methodArgVarExprs = - arguments.stream() - .map(arg -> methodArgVarExprMap.get(arg.name())) - .collect(Collectors.toList()); - // For loop client on iterateAll method. - // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) { - // //doThingsWith(element); - // } - VariableExpr elementVarExpr = createVariableExpr("element", pagedItemType); - Expr clientMethodIterateAllExpr = - createClientMethodIteratorAllExpr( - clientVarExpr, method.name(), methodArgVarExprs, pagedItemType); - ForStatement loopIteratorStatement = - ForStatement.builder() - .setLocalVariableExpr(elementVarExpr.toBuilder().setIsDecl(true).build()) - .setCollectionExpr(clientMethodIterateAllExpr) - .setBody(Arrays.asList(createLineCommentStatement("doThingsWith(element);"))) - .build(); - - List bodyExpr = new ArrayList<>(); - bodyExpr.addAll(methodArgumentsAssignmentExpr); - List bodyStatements = - bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()); - bodyStatements.add(loopIteratorStatement); - - return TryCatchStatement.builder() - .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) - .setTryBody(bodyStatements) - .setIsSampleCode(true) - .build(); - } - - // ==================================Helpers===================================================// - - // Assign client variable expr with create client. - // e.g EchoClient echoClient = EchoClient.create() - private static AssignmentExpr assignClientVariableWithCreateMethodExpr( - VariableExpr clientVarExpr) { - return AssignmentExpr.builder() - .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr( - MethodInvocationExpr.builder() - .setStaticReferenceType(clientVarExpr.variable().type()) - .setReturnType(clientVarExpr.variable().type()) - .setMethodName("create") - .build()) - .build(); - } - - // Create a Map where key is method's argument name, and value is its VariableExpr. - private static Map createMethodArgumentsVariableExprs( - List arguments) { - return arguments.stream() - .collect( - Collectors.toMap( - methodArg -> methodArg.name(), - methodArg -> - createVariableExpr( - JavaStyle.toLowerCamelCase(methodArg.name()), methodArg.type()))); - } - - // Return a list of AssignmentExpr for method argument with its default value. - private static List assignMethodArgumentsWithDefaultValues( - List arguments, - Map argVarExprs, - Map resourceNames) { - return arguments.stream() - .map( - arg -> - createAssignmentExpr( - argVarExprs.get(arg.name()), - DefaultValueComposer.createDefaultValue(arg, resourceNames))) - .collect(Collectors.toList()); - } - - private static Expr createAssignExprForVariableWithClientMethod( - VariableExpr variableExpr, - VariableExpr clientVarExpr, - String methodName, - List argumentsVarExprs) { - MethodInvocationExpr clientMethodInvocationExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(methodName)) - .setArguments(argumentsVarExprs) - .setReturnType(variableExpr.variable().type()) - .build(); - return AssignmentExpr.builder() - .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(clientMethodInvocationExpr) - .build(); - } - - private static Expr createClientMethodIteratorAllExpr( - VariableExpr clientVarExpr, - String methodName, - List methodArgVarExprs, - TypeNode pagedItemType) { - MethodInvocationExpr clientMethodExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(methodName)) - .setArguments(methodArgVarExprs) - .build(); - return MethodInvocationExpr.builder() - .setExprReferenceExpr(clientMethodExpr) - .setMethodName("iterateAll") - .setReturnType(pagedItemType) - .build(); - } - - private static String getClientName(TypeNode clientType) { - return JavaStyle.toLowerCamelCase(clientType.reference().name()); - } - - private static boolean isProtoEmptyType(TypeNode type) { - return type.reference().pakkage().equals("com.google.protobuf") - && type.reference().name().equals("Empty"); - } - - private static CommentStatement createLineCommentStatement(String content) { - return CommentStatement.withComment(LineComment.withComment(content)); - } - - private static AssignmentExpr createAssignmentExpr(VariableExpr variableExpr, Expr valueExpr) { - return AssignmentExpr.builder() - .setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(valueExpr) - .build(); - } - - private static VariableExpr createVariableExpr(String variableName, TypeNode type) { - return VariableExpr.builder() - .setVariable(Variable.builder().setName(variableName).setType(type).build()) - .build(); - } -} diff --git a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java deleted file mode 100644 index 48767125cf..0000000000 --- a/src/test/java/com/google/api/generator/gapic/composer/MethodSampleCodeHelperComposerTest.java +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.api.generator.gapic.composer; - -import static junit.framework.Assert.assertEquals; - -import com.google.api.generator.engine.ast.ConcreteReference; -import com.google.api.generator.engine.ast.Reference; -import com.google.api.generator.engine.ast.TypeNode; -import com.google.api.generator.engine.ast.VaporReference; -import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; -import com.google.api.generator.gapic.model.Field; -import com.google.api.generator.gapic.model.Method; -import com.google.api.generator.gapic.model.MethodArgument; -import com.google.api.generator.gapic.model.ResourceName; -import com.google.api.generator.gapic.model.ResourceReference; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class MethodSampleCodeHelperComposerTest { - private static final String PACKAGE_NAME = "com.google.showcase.v1beta1"; - private static final TypeNode clientType = - TypeNode.withReference( - VaporReference.builder().setName("EchoClient").setPakkage(PACKAGE_NAME).build()); - Map resourceNames = new HashMap<>(); - - @Before - public void setUp() { - ResourceName foobarResourceName = - ResourceName.builder() - .setVariableName("foobar") - .setPakkage(PACKAGE_NAME) - .setResourceTypeString("showcase.googleapis.com/Foobar") - .setPatterns( - Arrays.asList( - "projects/{project}/foobars/{foobar}", - "projects/{project}/chocolate/variants/{variant}/foobars/{foobar}", - "foobars/{foobar}", - "bar_foo/{bar_foo}/foobars/{foobar}")) - .setParentMessageName("Foobar") - .build(); - ResourceName anythingGoesResourceName = - ResourceName.createWildcard("showcase.googleapis.com/AnythingGoes", PACKAGE_NAME); - resourceNames.put("showcase.googleapis.com/Foobar", foobarResourceName); - resourceNames.put("showcase.googleapis.com/AnythingGoes", anythingGoesResourceName); - } - - // ==========================================Unary RPC Method Sample Code=======================// - @Test - public void composeUnaryRpcMethodSampleCode_resourceNameHelperMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - TypeNode resourceNameType = - TypeNode.withReference( - ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)); - MethodArgument arg = - MethodArgument.builder() - .setName("parent") - .setType(resourceNameType) - .setField( - Field.builder() - .setName("parent") - .setType(TypeNode.STRING) - .setResourceReference( - ResourceReference.withType("showcase.googleapis.com/AnythingGoes")) - .build()) - .setIsResourceNameHelper(true) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(parent);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - TypeNode methodArgType = - TypeNode.withReference( - VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build()); - Field methodArgField = - Field.builder() - .setName("error") - .setType(methodArgType) - .setIsMessage(true) - .setIsContainedInOneof(true) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("error") - .setType(methodArgType) - .setField(methodArgField) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " Status error = Status.newBuilder().build();\n" - + " EchoResponse response = echoClient.echo(error);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - TypeNode methodArgType = - TypeNode.withReference( - VaporReference.builder() - .setName("FoobarName") - .setPakkage(PACKAGE_NAME) - .setSupertypeReference( - ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class)) - .build()); - Field methodArgField = - Field.builder() - .setName("name") - .setType(TypeNode.STRING) - .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("name") - .setType(methodArgType) - .setField(methodArgField) - .setIsResourceNameHelper(true) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n" - + " EchoResponse response = echoClient.echo(name);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - Field methodArgField = - Field.builder() - .setName("content") - .setType(TypeNode.STRING) - .setIsContainedInOneof(true) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("content") - .setType(TypeNode.STRING) - .setField(methodArgField) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String content = \"content951530617\";\n" - + " EchoResponse response = echoClient.echo(content);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_strinWithResourceReferenceMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - Field methodArgField = - Field.builder() - .setName("name") - .setType(TypeNode.STRING) - .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar")) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("name") - .setType(TypeNode.STRING) - .setField(methodArgField) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String name = \"name3373707\";\n" - + " EchoResponse response = echoClient.echo(name);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - Field methodArgField = - Field.builder() - .setName("parent") - .setType(TypeNode.STRING) - .setResourceReference( - ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("parent") - .setType(TypeNode.STRING) - .setField(methodArgField) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String parent = \"parent-995424086\";\n" - + " EchoResponse response = echoClient.echo(parent);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - Field methodArgField = - Field.builder() - .setName("display_name") - .setType(TypeNode.STRING) - .setResourceReference( - ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes")) - .build(); - Reference userRef = VaporReference.builder().setName("User").setPakkage(PACKAGE_NAME).build(); - Field nestFiled = - Field.builder() - .setName("user") - .setType(TypeNode.withReference(userRef)) - .setIsMessage(true) - .build(); - MethodArgument arg = - MethodArgument.builder() - .setName("display_name") - .setType(TypeNode.STRING) - .setField(methodArgField) - .setNestedFields(Arrays.asList(nestFiled)) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String displayName = \"display_name1615086568\";\n" - + " EchoResponse response = echoClient.echo(displayName);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoRequest").setPakkage(PACKAGE_NAME).build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("EchoResponse").setPakkage(PACKAGE_NAME).build()); - MethodArgument arg1 = - MethodArgument.builder() - .setName("content") - .setType(TypeNode.STRING) - .setField(Field.builder().setName("content").setType(TypeNode.STRING).build()) - .build(); - TypeNode severityType = - TypeNode.withReference( - VaporReference.builder().setName("Severity").setPakkage(PACKAGE_NAME).build()); - MethodArgument arg2 = - MethodArgument.builder() - .setName("severity") - .setType(severityType) - .setField( - Field.builder().setName("severity").setType(severityType).setIsEnum(true).build()) - .build(); - List> signatures = Arrays.asList(Arrays.asList(arg1, arg2)); - Method unaryMethod = - Method.builder() - .setName("echo") - .setMethodSignatures(signatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, signatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String content = \"content951530617\";\n" - + " Severity severity = Severity.forNumber(0);\n" - + " EchoResponse response = echoClient.echo(content, severity);\n" - + "}"; - assertEquals(expected, results); - } - - @Test - public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder() - .setName("DeleteUserRequest") - .setPakkage("com.google.showcase.v1beta1") - .build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder().setName("Empty").setPakkage("com.google.protobuf").build()); - List> methodSignatures = - Arrays.asList( - Arrays.asList( - MethodArgument.builder() - .setName("name") - .setType(TypeNode.STRING) - .setField(Field.builder().setName("name").setType(TypeNode.STRING).build()) - .build())); - Method unaryMethod = - Method.builder() - .setName("delete") - .setMethodSignatures(methodSignatures) - .setInputType(inputType) - .setOutputType(outputType) - .build(); - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryRpcMethodSampleCode( - unaryMethod, methodSignatures.get(0), clientType, resourceNames)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " String name = \"name3373707\";\n" - + " echoClient.delete(name);\n" - + "}"; - Assert.assertEquals(results, expected); - } - - // ===================================Unary Paged RPC Method Sample Code ======================// - @Test - public void composeUnaryPagedRpcMethodSampleCode() { - TypeNode inputType = - TypeNode.withReference( - VaporReference.builder() - .setName("ListContentRequest") - .setPakkage(PACKAGE_NAME) - .build()); - TypeNode outputType = - TypeNode.withReference( - VaporReference.builder() - .setName("ListContentResponse") - .setPakkage(PACKAGE_NAME) - .build()); - TypeNode resourceNameType = - TypeNode.withReference( - ConcreteReference.builder() - .setClazz(List.class) - .setGenerics(ConcreteReference.withClazz(String.class)) - .build()); - List arguments = - Arrays.asList( - MethodArgument.builder() - .setName("resourceName") - .setType(resourceNameType) - .setField( - Field.builder() - .setName("resourceName") - .setType(resourceNameType) - .setIsRepeated(true) - .build()) - .build(), - MethodArgument.builder() - .setName("filter") - .setType(TypeNode.STRING) - .setField(Field.builder().setName("filter").setType(TypeNode.STRING).build()) - .build()); - Method method = - Method.builder() - .setName("ListContent") - .setMethodSignatures(Arrays.asList(arguments)) - .setInputType(inputType) - .setOutputType(outputType) - .setIsPaged(true) - .build(); - TypeNode pagedItemType = - TypeNode.withReference( - VaporReference.builder().setName("Content").setPakkage(PACKAGE_NAME).build()); - - String results = - SampleCodeWriter.write( - MethodSampleCodeHelperComposer.composeUnaryPagedRpcMethodSampleCode( - method, arguments, clientType, resourceNames, pagedItemType)); - String expected = - "try (EchoClient echoClient = EchoClient.create()) {\n" - + " List resourceName = new ArrayList<>();\n" - + " String filter = \"filter-1274492040\";\n" - + " for (Content element : echoClient.listContent(resourceName, filter).iterateAll()) {\n" - + " // doThingsWith(element);\n" - + " }\n" - + "}"; - Assert.assertEquals(results, expected); - } -} From e20d8707fef81a9857040450a2df0916340f03ec Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:17:32 -0800 Subject: [PATCH 24/32] rebase previous PR and address the comments --- .../composer/ServiceClientClassComposer.java | 11 +- .../ServiceClientSampleCodeComposer.java | 128 ++++++++++- .../ServiceClientSampleCodeComposerTest.java | 209 +++++++++++++++++- .../gapic/composer/goldens/EchoClient.golden | 10 + .../goldens/logging/ConfigClient.java | 9 +- .../goldens/logging/LoggingClient.java | 2 +- .../goldens/logging/MetricsClient.java | 2 +- .../goldens/redis/CloudRedisClient.java | 2 +- 8 files changed, 360 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index a83e922f46..9f0e01593a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -484,7 +484,8 @@ private static List createServiceMethods( for (Method method : service.methods()) { if (method.stream().equals(Stream.NONE)) { javaMethods.addAll( - createMethodVariants(method, messageTypes, types, clientName, resourceNames)); + createMethodVariants( + method, getClientClassName(service), messageTypes, types, resourceNames)); javaMethods.add(createMethodDefaultMethod(method, types)); } if (method.hasLro()) { @@ -566,13 +567,13 @@ private static List createMethodVariants( .build(); Optional methodSampleCode = Optional.empty(); - if (!method.isPaged() && !method.hasLro()) { - // TODO(summerji): Remove the condition check once finished the implementation on paged - // sample code and lro sample code. + if (!method.hasLro()) { + // TODO(summerji): Remove the condition check once finished the implementation on lro sample + // code. methodSampleCode = Optional.of( ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( - method, types.get(clientName), signature, resourceNames)); + method, types.get(clientName), signature, resourceNames, messageTypes)); } MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java index b009d079c4..ac48ffd54d 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java @@ -16,16 +16,22 @@ import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.generator.engine.ast.AssignmentExpr; +import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.ConcreteReference; import com.google.api.generator.engine.ast.Expr; import com.google.api.generator.engine.ast.ExprStatement; +import com.google.api.generator.engine.ast.ForStatement; +import com.google.api.generator.engine.ast.LineComment; import com.google.api.generator.engine.ast.MethodInvocationExpr; +import com.google.api.generator.engine.ast.Statement; import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; 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.samplecode.SampleCodeWriter; +import com.google.api.generator.gapic.model.Field; +import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; @@ -186,8 +192,24 @@ public static String composeRpcMethodHeaderSampleCode( Method method, TypeNode clientType, List arguments, - Map resourceNames) { + Map resourceNames, + Map messageTypes) { // TODO(summerji): Add other types RPC methods' sample code. + if (method.isPaged()) { + // Find the repeated field. + Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName()); + Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField(); + Preconditions.checkNotNull( + repeatedPagedResultsField, + String.format( + "No repeated field found on message %s for method %s", + methodOutputMessage.name(), method.name())); + + TypeNode repeatedResponseType = repeatedPagedResultsField.type(); + return SampleCodeWriter.write( + composeUnaryPagedRpcMethodSampleCode( + method, arguments, clientType, resourceNames, repeatedResponseType)); + } return SampleCodeWriter.write( composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames)); } @@ -290,6 +312,106 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode( .build(); } + public static TryCatchStatement composeUnaryPagedRpcMethodSampleCode( + Method method, + List arguments, + TypeNode clientType, + Map resourceNames, + TypeNode repeatedResponseType) { + VariableExpr clientVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(clientType.reference().name())) + .setType(clientType) + .build()); + // List of rpc method arguments' variable expressions. + List rpcMethodArgVarExprs = + arguments.stream() + .map( + arg -> + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(arg.name())) + .setType(arg.type()) + .build())) + .collect(Collectors.toList()); + // List of rpc method arguments' default value expression. + List resourceNameList = + resourceNames.values().stream().collect(Collectors.toList()); + List rpcMethodArgDefaultValueExprs = + arguments.stream() + .map( + arg -> + !isStringTypedResourceName(arg, resourceNames) + ? DefaultValueComposer.createDefaultValue(arg, resourceNames) + : MethodInvocationExpr.builder() + .setExprReferenceExpr( + DefaultValueComposer.createDefaultValue( + resourceNames.get( + arg.field().resourceReference().resourceTypeString()), + resourceNameList, + arg.field().name())) + .setMethodName("toString") + .setReturnType(TypeNode.STRING) + .build()) + .collect(Collectors.toList()); + + List bodyExprs = new ArrayList<>(); + Preconditions.checkState( + rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(), + "The method arguments' the number of variable expressions should equal to the number of default value expressions."); + bodyExprs.addAll( + IntStream.range(0, rpcMethodArgVarExprs.size()) + .mapToObj( + i -> + AssignmentExpr.builder() + .setVariableExpr( + ((VariableExpr) rpcMethodArgVarExprs.get(i)) + .toBuilder() + .setIsDecl(true) + .build()) + .setValueExpr(rpcMethodArgDefaultValueExprs.get(i)) + .build()) + .collect(Collectors.toList())); + // For loop paged response item on iterateAll method. + // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) { + // //doThingsWith(element); + // } + MethodInvocationExpr clientMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientVarExpr) + .setMethodName(JavaStyle.toLowerCamelCase(method.name())) + .setArguments(rpcMethodArgVarExprs) + .build(); + Expr clientMethodIteratorAllExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientMethodExpr) + .setMethodName("iterateAll") + .setReturnType(repeatedResponseType) + .build(); + ForStatement loopIteratorStatement = + ForStatement.builder() + .setLocalVariableExpr( + VariableExpr.builder() + .setVariable( + Variable.builder().setName("element").setType(repeatedResponseType).build()) + .setIsDecl(true) + .build()) + .setCollectionExpr(clientMethodIteratorAllExpr) + .setBody(Arrays.asList(createLineCommentStatement("doThingsWith(element);"))) + .build(); + + List bodyStatements = + bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()); + bodyStatements.add(loopIteratorStatement); + + return TryCatchStatement.builder() + .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr)) + .setTryBody(bodyStatements) + .setIsSampleCode(true) + .build(); + } + // ==================================Helpers===================================================// // Assign client variable expr with create client. @@ -318,4 +440,8 @@ private static boolean isProtoEmptyType(TypeNode type) { return type.reference().pakkage().equals("com.google.protobuf") && type.reference().name().equals("Empty"); } + + private static CommentStatement createLineCommentStatement(String content) { + return CommentStatement.withComment(LineComment.withComment(content)); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java index 384f2d97c1..d2172005fa 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.composer; import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertThrows; import com.google.api.generator.engine.ast.ConcreteReference; import com.google.api.generator.engine.ast.Reference; @@ -22,6 +23,7 @@ import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter; import com.google.api.generator.gapic.model.Field; +import com.google.api.generator.gapic.model.Message; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; @@ -35,6 +37,7 @@ import java.util.List; import java.util.Map; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; public class ServiceClientSampleCodeComposerTest { @@ -44,6 +47,7 @@ public class ServiceClientSampleCodeComposerTest { public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + Map messageTypes = Parser.parseMessages(echoFileDescriptor); TypeNode clientType = TypeNode.withReference( VaporReference.builder() @@ -72,7 +76,7 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { .build(); String results = ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( - method, clientType, methodArguments, resourceNames); + method, clientType, methodArguments, resourceNames, messageTypes); String expected = LineFormatter.lines( "try (EchoClient echoClient = EchoClient.create()) {\n", @@ -81,6 +85,94 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() { assertEquals(expected, results); } + @Test + public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTypeInPagedMethod() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + Map messageTypes = Parser.parseMessages(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("PagedResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + List methodArguments = Collections.emptyList(); + Method method = + Method.builder() + .setName("simplePagedMethod") + .setMethodSignatures(Arrays.asList(methodArguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + assertThrows( + NullPointerException.class, + () -> + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, clientType, methodArguments, resourceNames, messageTypes)); + } + + @Test + public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPagedMethod() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + Map messageTypes = Parser.parseMessages(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder() + .setName("EchoClient") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder().setName("PagedResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + List methodArguments = Collections.emptyList(); + Method method = + Method.builder() + .setName("simplePagedMethod") + .setMethodSignatures(Arrays.asList(methodArguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + Field responseField = + Field.builder() + .setName("response") + .setType( + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(List.class) + .setGenerics(ConcreteReference.withClazz(String.class)) + .build())) + .setIsMessage(true) + .setIsRepeated(false) + .build(); + Field nextPageToken = + Field.builder().setName("next_page_token").setType(TypeNode.STRING).build(); + Message noRepeatedFiledMessage = + Message.builder() + .setName("PagedResponse") + .setType(outputType) + .setFields(Arrays.asList(responseField, nextPageToken)) + .build(); + messageTypes.put("PagedResponse", noRepeatedFiledMessage); + assertThrows( + NullPointerException.class, + () -> + ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + method, clientType, methodArguments, resourceNames, messageTypes)); + } + + // ==========================================Unary RPC Method Sample Code=======================// @Test public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() { FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); @@ -651,4 +743,119 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() { "}"); Assert.assertEquals(results, expected); } + + // ===================================Unary Paged RPC Method Sample Code ======================// + @Test + public void validComposeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() { + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode resourceNameType = + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(List.class) + .setGenerics(ConcreteReference.withClazz(String.class)) + .build()); + List arguments = + Arrays.asList( + MethodArgument.builder() + .setName("resourceName") + .setType(resourceNameType) + .setField( + Field.builder() + .setName("resourceName") + .setType(resourceNameType) + .setIsRepeated(true) + .build()) + .build(), + MethodArgument.builder() + .setName("filter") + .setType(TypeNode.STRING) + .setField(Field.builder().setName("filter").setType(TypeNode.STRING).build()) + .build()); + Method method = + Method.builder() + .setName("ListContent") + .setMethodSignatures(Arrays.asList(arguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + TypeNode repeatedResponseType = + TypeNode.withReference( + VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode( + method, clientType, arguments, resourceNames, repeatedResponseType)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " List resourceName = new ArrayList<>();\n", + " String filter = \"filter-1274492040\";\n", + " for (Content element : echoClient.listContent(resourceName, filter).iterateAll()) {\n", + " // doThingsWith(element);\n", + " }\n", + "}"); + Assert.assertEquals(results, expected); + } + + @Test + public void validComposeUnaryPagedRpcMethodSampleCode_noMethodArguments() { + FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor(); + Map resourceNames = Parser.parseResourceNames(echoFileDescriptor); + TypeNode clientType = + TypeNode.withReference( + VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + TypeNode inputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentRequest") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + TypeNode outputType = + TypeNode.withReference( + VaporReference.builder() + .setName("ListContentResponse") + .setPakkage(SHOWCASE_PACKAGE_NAME) + .build()); + List arguments = Collections.emptyList(); + Method method = + Method.builder() + .setName("ListContent") + .setMethodSignatures(Arrays.asList(arguments)) + .setInputType(inputType) + .setOutputType(outputType) + .setIsPaged(true) + .build(); + TypeNode repeatedResponseType = + TypeNode.withReference( + VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build()); + + String results = + SampleCodeWriter.write( + ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode( + method, clientType, arguments, resourceNames, repeatedResponseType)); + String expected = + LineFormatter.lines( + "try (EchoClient echoClient = EchoClient.create()) {\n", + " for (Content element : echoClient.listContent().iterateAll()) {\n", + " // doThingsWith(element);\n", + " }\n", + "}"); + Assert.assertEquals(results, expected); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 3750febf6c..83c3bcbcb7 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -361,6 +361,16 @@ public class EchoClient implements BackgroundResource { // AUTO-GENERATED DOCUMENTATION AND METHOD. /** + * Sample code: + * + *
{@code
+   * try (EchoClient echoClient = EchoClient.create()) {
+   *   for (EchoResponse element : echoClient.simplePagedExpand().iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * * @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 */ diff --git a/test/integration/goldens/logging/ConfigClient.java b/test/integration/goldens/logging/ConfigClient.java index 2e79c2fcfa..bf9f3e3e82 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -309,7 +309,9 @@ public final ListBucketsPagedResponse listBuckets(OrganizationLocationName paren * *
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent =
+   *       LogBucketName.ofProjectLocationBucketName("[PROJECT]", "[LOCATION]", "[BUCKET]")
+   *           .toString();
    *   for (LogBucket element : configClient.listBuckets(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
@@ -534,7 +536,7 @@ public final ListSinksPagedResponse listSinks(ProjectName parent) {
    *
    * 
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent = LogSinkName.ofProjectSinkName("[PROJECT]", "[SINK]").toString();
    *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
@@ -1254,7 +1256,8 @@ public final ListExclusionsPagedResponse listExclusions(ProjectName parent) {
    *
    * 
{@code
    * try (ConfigClient configClient = ConfigClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent =
+   *       LogExclusionName.ofProjectExclusionName("[PROJECT]", "[EXCLUSION]").toString();
    *   for (LogExclusion element : configClient.listExclusions(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java
index f70230e871..60826d04b2 100644
--- a/test/integration/goldens/logging/LoggingClient.java
+++ b/test/integration/goldens/logging/LoggingClient.java
@@ -660,7 +660,7 @@ public final ListLogsPagedResponse listLogs(ProjectName parent) {
    *
    * 
{@code
    * try (LoggingClient loggingClient = LoggingClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent = LogName.ofProjectLogName("[PROJECT]", "[LOG]").toString();
    *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
diff --git a/test/integration/goldens/logging/MetricsClient.java b/test/integration/goldens/logging/MetricsClient.java
index 1e9ad1a745..dd4d7976d1 100644
--- a/test/integration/goldens/logging/MetricsClient.java
+++ b/test/integration/goldens/logging/MetricsClient.java
@@ -183,7 +183,7 @@ public final ListLogMetricsPagedResponse listLogMetrics(ProjectName parent) {
    *
    * 
{@code
    * try (MetricsClient metricsClient = MetricsClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent = ProjectName.of("[PROJECT]").toString();
    *   for (LogMetric element : metricsClient.listLogMetrics(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java
index c97f8f0d9d..d2ff33528b 100644
--- a/test/integration/goldens/redis/CloudRedisClient.java
+++ b/test/integration/goldens/redis/CloudRedisClient.java
@@ -230,7 +230,7 @@ public final ListInstancesPagedResponse listInstances(LocationName parent) {
    *
    * 
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   String parent = "parent-995424086";
+   *   String parent = LocationName.of("[PROJECT]", "[LOCATION]").toString();
    *   for (Instance element : cloudRedisClient.listInstances(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }

From 8e0e7e7c6f0c8333cc16794677360b8be388506a Mon Sep 17 00:00:00 2001
From: summerji 
Date: Fri, 4 Dec 2020 19:19:29 -0800
Subject: [PATCH 25/32] rebase previous PR

---
 .../ServiceClientSampleCodeComposerTest.java  | 195 +++++++-----------
 .../goldens/logging/LoggingClient.java        |   2 +-
 2 files changed, 78 insertions(+), 119 deletions(-)

diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index d2172005fa..23f1385934 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -85,6 +85,48 @@ public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() {
     assertEquals(expected, results);
   }
 
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_pagedUnaryRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    List methodArguments = Collections.emptyList();
+    Method method =
+        Method.builder()
+            .setName("SimplePagedExpand")
+            .setMethodSignatures(Arrays.asList(methodArguments))
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setIsPaged(true)
+            .build();
+    String results =
+        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, methodArguments, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  for (EchoResponse element : echoClient.simplePagedExpand().iterateAll()) {\n",
+            "    // doThingsWith(element);\n",
+            "  }\n",
+            "}");
+    assertEquals(expected, results);
+  }
+
   @Test
   public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTypeInPagedMethod() {
     FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
@@ -95,7 +137,7 @@ public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTyp
             VaporReference.builder()
                 .setName("EchoClient")
                 .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());    
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
@@ -128,7 +170,7 @@ public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPage
             VaporReference.builder()
                 .setName("EchoClient")
                 .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());    
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
@@ -179,22 +221,13 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode resourceNameType =
         TypeNode.withReference(
             ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class));
@@ -238,22 +271,13 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode methodArgType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -302,22 +326,13 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     Field methodArgField =
         Field.builder()
             .setName("name")
@@ -357,22 +372,13 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     Field methodArgField =
         Field.builder()
             .setName("parent")
@@ -413,22 +419,13 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode methodArgType =
         TypeNode.withReference(
             VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build());
@@ -472,22 +469,13 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     Field methodArgField =
         Field.builder()
             .setName("display_name")
@@ -495,8 +483,7 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() {
             .setResourceReference(
                 ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes"))
             .build();
-    Reference userRef =
-        VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build();
+    Reference userRef = VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build();
     Field nestFiled =
         Field.builder()
             .setName("user")
@@ -546,22 +533,13 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     Field methodArgField =
         Field.builder()
             .setName("content")
@@ -601,22 +579,13 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     MethodArgument arg1 =
         MethodArgument.builder()
             .setName("content")
@@ -661,22 +630,13 @@ public void composeUnaryRpcMethodSampleCode_noMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     List> signatures = Arrays.asList(Collections.emptyList());
     Method unaryMethod =
         Method.builder()
@@ -703,10 +663,7 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
+            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -747,6 +704,8 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() {
   // ===================================Unary Paged RPC Method Sample Code ======================//
   @Test
   public void validComposeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
             VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
@@ -800,7 +759,7 @@ public void validComposeUnaryPagedRpcMethodSampleCode_multipleMethodArguments()
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, clientType, arguments, resourceNames, repeatedResponseType));
+                method, arguments, clientType, resourceNames, repeatedResponseType));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",
@@ -848,7 +807,7 @@ public void validComposeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, clientType, arguments, resourceNames, repeatedResponseType));
+                method, arguments, clientType, resourceNames, repeatedResponseType));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",
diff --git a/test/integration/goldens/logging/LoggingClient.java b/test/integration/goldens/logging/LoggingClient.java
index 60826d04b2..8984205cc6 100644
--- a/test/integration/goldens/logging/LoggingClient.java
+++ b/test/integration/goldens/logging/LoggingClient.java
@@ -431,7 +431,7 @@ public final WriteLogEntriesResponse writeLogEntries(WriteLogEntriesRequest requ
    * try (LoggingClient loggingClient = LoggingClient.create()) {
    *   List resourceNames = new ArrayList<>();
    *   String filter = "filter-1274492040";
-   *   String orderBy = "order_by1234304744";
+   *   String orderBy = "orderBy-1207110587";
    *   for (LogEntry element :
    *       loggingClient.listLogEntries(resourceNames, filter, orderBy).iterateAll()) {
    *     // doThingsWith(element);

From 21bf8b4f09feaf56682c70f9bbe143c78370b043 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Sat, 5 Dec 2020 17:08:03 -0800
Subject: [PATCH 26/32] Make composeUnaryPagedRpcMethodSampleCode
 VisibleForTesting

---
 .../gapic/composer/ServiceClientSampleCodeComposer.java        | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index ac48ffd54d..4600e17660 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -312,7 +312,8 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
         .build();
   }
 
-  public static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
+  @VisibleForTesting
+  static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
       Method method,
       List arguments,
       TypeNode clientType,

From 22a77aa843d96b75d6e8c97b0b5c047925383354 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Mon, 7 Dec 2020 23:17:20 -0800
Subject: [PATCH 27/32] abstract functions for reuse

---
 .../ServiceClientSampleCodeComposer.java      | 161 +++++++-----------
 .../ServiceClientSampleCodeComposerTest.java  |  16 +-
 2 files changed, 73 insertions(+), 104 deletions(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index 4600e17660..c7451494a3 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -38,7 +38,6 @@
 import com.google.api.generator.gapic.utils.JavaStyle;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -226,52 +225,12 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
                 .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
                 .setType(clientType)
                 .build());
-    // List of rpc method arguments' variable expressions.
-    List rpcMethodArgVarExprs =
-        arguments.stream()
-            .map(
-                arg ->
-                    VariableExpr.withVariable(
-                        Variable.builder()
-                            .setName(JavaStyle.toLowerCamelCase(arg.name()))
-                            .setType(arg.type())
-                            .build()))
-            .collect(Collectors.toList());
-    // List of rpc method arguments' default value expression.
-    List resourceNameList =
-        resourceNames.values().stream().collect(Collectors.toList());
+    List rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
     List rpcMethodArgDefaultValueExprs =
-        arguments.stream()
-            .map(
-                arg ->
-                    !isStringTypedResourceName(arg, resourceNames)
-                        ? DefaultValueComposer.createDefaultValue(arg, resourceNames)
-                        : MethodInvocationExpr.builder()
-                            .setExprReferenceExpr(
-                                DefaultValueComposer.createDefaultValue(
-                                    resourceNames.get(
-                                        arg.field().resourceReference().resourceTypeString()),
-                                    resourceNameList,
-                                    arg.field().name()))
-                            .setMethodName("toString")
-                            .setReturnType(TypeNode.STRING)
-                            .build())
-            .collect(Collectors.toList());
-
-    List bodyExprs = new ArrayList<>();
-    Preconditions.checkState(
-        rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
-        "Expected the number of method arguments to match the number of default values.");
-    bodyExprs.addAll(
-        IntStream.range(0, rpcMethodArgVarExprs.size())
-            .mapToObj(
-                i ->
-                    AssignmentExpr.builder()
-                        .setVariableExpr(
-                            (rpcMethodArgVarExprs.get(i)).toBuilder().setIsDecl(true).build())
-                        .setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
-                        .build())
-            .collect(Collectors.toList()));
+        createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
+    List bodyExprs =
+        createMethodArgAssignmentWithDefaultValue(
+            rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
     // Invoke current method based on return type.
     // e.g. if return void, echoClient.echo(..); or,
     // e.g. if return other type, EchoResponse response = echoClient.echo(...);
@@ -325,55 +284,12 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
                 .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
                 .setType(clientType)
                 .build());
-    // List of rpc method arguments' variable expressions.
-    List rpcMethodArgVarExprs =
-        arguments.stream()
-            .map(
-                arg ->
-                    VariableExpr.withVariable(
-                        Variable.builder()
-                            .setName(JavaStyle.toLowerCamelCase(arg.name()))
-                            .setType(arg.type())
-                            .build()))
-            .collect(Collectors.toList());
-    // List of rpc method arguments' default value expression.
-    List resourceNameList =
-        resourceNames.values().stream().collect(Collectors.toList());
+    List rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
     List rpcMethodArgDefaultValueExprs =
-        arguments.stream()
-            .map(
-                arg ->
-                    !isStringTypedResourceName(arg, resourceNames)
-                        ? DefaultValueComposer.createDefaultValue(arg, resourceNames)
-                        : MethodInvocationExpr.builder()
-                            .setExprReferenceExpr(
-                                DefaultValueComposer.createDefaultValue(
-                                    resourceNames.get(
-                                        arg.field().resourceReference().resourceTypeString()),
-                                    resourceNameList,
-                                    arg.field().name()))
-                            .setMethodName("toString")
-                            .setReturnType(TypeNode.STRING)
-                            .build())
-            .collect(Collectors.toList());
-
-    List bodyExprs = new ArrayList<>();
-    Preconditions.checkState(
-        rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
-        "The method arguments' the number of variable expressions should equal to the number of default value expressions.");
-    bodyExprs.addAll(
-        IntStream.range(0, rpcMethodArgVarExprs.size())
-            .mapToObj(
-                i ->
-                    AssignmentExpr.builder()
-                        .setVariableExpr(
-                            ((VariableExpr) rpcMethodArgVarExprs.get(i))
-                                .toBuilder()
-                                .setIsDecl(true)
-                                .build())
-                        .setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
-                        .build())
-            .collect(Collectors.toList()));
+        createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
+    List bodyExprs =
+        createMethodArgAssignmentWithDefaultValue(
+            rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
     // For loop paged response item on iterateAll method.
     // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
     //          //doThingsWith(element);
@@ -382,7 +298,8 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
         MethodInvocationExpr.builder()
             .setExprReferenceExpr(clientVarExpr)
             .setMethodName(JavaStyle.toLowerCamelCase(method.name()))
-            .setArguments(rpcMethodArgVarExprs)
+            .setArguments(
+                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
             .build();
     Expr clientMethodIteratorAllExpr =
         MethodInvocationExpr.builder()
@@ -415,6 +332,60 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
 
   // ==================================Helpers===================================================//
 
+  // Create a list of RPC method arguments' variable expressions.
+  private static List createRpcMethodArgumentVariableExprs(
+      List arguments) {
+    return arguments.stream()
+        .map(
+            arg ->
+                VariableExpr.withVariable(
+                    Variable.builder()
+                        .setName(JavaStyle.toLowerCamelCase(arg.name()))
+                        .setType(arg.type())
+                        .build()))
+        .collect(Collectors.toList());
+  }
+
+  // Create a list of RPC method arguments' default value expression.
+  private static List createRpcMethodArgumentDefaultValueExprs(
+      List arguments, Map resourceNames) {
+    List resourceNameList =
+        resourceNames.values().stream().collect(Collectors.toList());
+    return arguments.stream()
+        .map(
+            arg ->
+                !isStringTypedResourceName(arg, resourceNames)
+                    ? DefaultValueComposer.createDefaultValue(arg, resourceNames)
+                    : MethodInvocationExpr.builder()
+                        .setExprReferenceExpr(
+                            DefaultValueComposer.createDefaultValue(
+                                resourceNames.get(
+                                    arg.field().resourceReference().resourceTypeString()),
+                                resourceNameList,
+                                arg.field().name()))
+                        .setMethodName("toString")
+                        .setReturnType(TypeNode.STRING)
+                        .build())
+        .collect(Collectors.toList());
+  }
+
+  // Create a list of assignment expressions for method argument with its default value.
+  private static List createMethodArgAssignmentWithDefaultValue(
+      List rpcMethodArgVarExprs, List rpcMethodArgDefaultValueExprs) {
+    Preconditions.checkState(
+        rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
+        "Expected the number of method arguments to match the number of default values.");
+    return IntStream.range(0, rpcMethodArgVarExprs.size())
+        .mapToObj(
+            i ->
+                AssignmentExpr.builder()
+                    .setVariableExpr(
+                        rpcMethodArgVarExprs.get(i).toBuilder().setIsDecl(true).build())
+                    .setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
+                    .build())
+        .collect(Collectors.toList());
+  }
+
   // Assign client variable expr with create client.
   // e.g EchoClient echoClient = EchoClient.create()
   private static AssignmentExpr assignClientVariableWithCreateMethodExpr(
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index 23f1385934..94bbe1a26c 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -36,7 +36,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -105,18 +104,17 @@ public void validComposeRpcMethodHeaderSampleCode_pagedUnaryRpc() {
                 .setName("PagedExpandResponse")
                 .setPakkage(SHOWCASE_PACKAGE_NAME)
                 .build());
-    List methodArguments = Collections.emptyList();
     Method method =
         Method.builder()
             .setName("SimplePagedExpand")
-            .setMethodSignatures(Arrays.asList(methodArguments))
+            .setMethodSignatures(Collections.emptyList())
             .setInputType(inputType)
             .setOutputType(outputType)
             .setIsPaged(true)
             .build();
     String results =
         ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, methodArguments, resourceNames, messageTypes);
+            method, clientType, Collections.emptyList(), resourceNames, messageTypes);
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",
@@ -698,12 +696,12 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() {
             "  String name = \"name3373707\";\n",
             "  echoClient.delete(name);\n",
             "}");
-    Assert.assertEquals(results, expected);
+    assertEquals(results, expected);
   }
 
   // ===================================Unary Paged RPC Method Sample Code ======================//
   @Test
-  public void validComposeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
+  public void composeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
     FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
@@ -769,11 +767,11 @@ public void validComposeUnaryPagedRpcMethodSampleCode_multipleMethodArguments()
             "    // doThingsWith(element);\n",
             "  }\n",
             "}");
-    Assert.assertEquals(results, expected);
+    assertEquals(results, expected);
   }
 
   @Test
-  public void validComposeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
+  public void composeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
     FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
@@ -815,6 +813,6 @@ public void validComposeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
             "    // doThingsWith(element);\n",
             "  }\n",
             "}");
-    Assert.assertEquals(results, expected);
+    assertEquals(results, expected);
   }
 }

From dbf522f59fea61e3ec45392e2c9c55e8088b2853 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Mon, 7 Dec 2020 23:26:43 -0800
Subject: [PATCH 28/32] Unwrap a helper function

---
 .../gapic/composer/ServiceClientClassComposer.java       | 1 -
 .../gapic/composer/ServiceClientSampleCodeComposer.java  | 9 ++++-----
 .../composer/ServiceClientSampleCodeComposerTest.java    | 2 +-
 3 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java
index 9f0e01593a..35dff2c4d7 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java
@@ -480,7 +480,6 @@ private static List createServiceMethods(
       Map types,
       Map resourceNames) {
     List javaMethods = new ArrayList<>();
-    String clientName = getClientClassName(service);
     for (Method method : service.methods()) {
       if (method.stream().equals(Stream.NONE)) {
         javaMethods.addAll(
diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index c7451494a3..e1cd3f8da3 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -316,7 +316,10 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
                     .setIsDecl(true)
                     .build())
             .setCollectionExpr(clientMethodIteratorAllExpr)
-            .setBody(Arrays.asList(createLineCommentStatement("doThingsWith(element);")))
+            .setBody(
+                Arrays.asList(
+                    CommentStatement.withComment(
+                        LineComment.withComment("doThingsWith(element);"))))
             .build();
 
     List bodyStatements =
@@ -412,8 +415,4 @@ private static boolean isProtoEmptyType(TypeNode type) {
     return type.reference().pakkage().equals("com.google.protobuf")
         && type.reference().name().equals("Empty");
   }
-
-  private static CommentStatement createLineCommentStatement(String content) {
-    return CommentStatement.withComment(LineComment.withComment(content));
-  }
 }
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index 94bbe1a26c..2b79d1dc56 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -212,7 +212,7 @@ public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPage
                 method, clientType, methodArguments, resourceNames, messageTypes));
   }
 
-  // ==========================================Unary RPC Method Sample Code=======================//
+  // =======================================Unary RPC Method Sample Code=======================//
   @Test
   public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() {
     FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();

From a04300471086f09b92ccdb25f0f9aa0b8a6e5451 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Tue, 8 Dec 2020 21:02:53 -0800
Subject: [PATCH 29/32] Use Function Interface

---
 .../ServiceClientSampleCodeComposer.java      |  42 ++--
 .../ServiceClientSampleCodeComposerTest.java  | 180 ++++++++++++++----
 2 files changed, 165 insertions(+), 57 deletions(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index e1cd3f8da3..51873bc05a 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -41,6 +41,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -229,7 +230,7 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
     List rpcMethodArgDefaultValueExprs =
         createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
     List bodyExprs =
-        createMethodArgAssignmentWithDefaultValue(
+        createAssignmentsForVarExprsWithValueExprs(
             rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
     // Invoke current method based on return type.
     // e.g. if return void, echoClient.echo(..); or,
@@ -288,7 +289,7 @@ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
     List rpcMethodArgDefaultValueExprs =
         createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
     List bodyExprs =
-        createMethodArgAssignmentWithDefaultValue(
+        createAssignmentsForVarExprsWithValueExprs(
             rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
     // For loop paged response item on iterateAll method.
     // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
@@ -354,37 +355,38 @@ private static List createRpcMethodArgumentDefaultValueExprs(
       List arguments, Map resourceNames) {
     List resourceNameList =
         resourceNames.values().stream().collect(Collectors.toList());
+    Function stringResourceNameDefaultValueExpr =
+        arg ->
+            MethodInvocationExpr.builder()
+                .setExprReferenceExpr(
+                    DefaultValueComposer.createDefaultValue(
+                        resourceNames.get(arg.field().resourceReference().resourceTypeString()),
+                        resourceNameList,
+                        arg.field().name()))
+                .setMethodName("toString")
+                .setReturnType(TypeNode.STRING)
+                .build();
     return arguments.stream()
         .map(
             arg ->
                 !isStringTypedResourceName(arg, resourceNames)
                     ? DefaultValueComposer.createDefaultValue(arg, resourceNames)
-                    : MethodInvocationExpr.builder()
-                        .setExprReferenceExpr(
-                            DefaultValueComposer.createDefaultValue(
-                                resourceNames.get(
-                                    arg.field().resourceReference().resourceTypeString()),
-                                resourceNameList,
-                                arg.field().name()))
-                        .setMethodName("toString")
-                        .setReturnType(TypeNode.STRING)
-                        .build())
+                    : stringResourceNameDefaultValueExpr.apply(arg))
         .collect(Collectors.toList());
   }
 
-  // Create a list of assignment expressions for method argument with its default value.
-  private static List createMethodArgAssignmentWithDefaultValue(
-      List rpcMethodArgVarExprs, List rpcMethodArgDefaultValueExprs) {
+  // Create a list of assignment expressions for variable expr with value expr.
+  private static List createAssignmentsForVarExprsWithValueExprs(
+      List variableExprs, List valueExprs) {
     Preconditions.checkState(
-        rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
+        variableExprs.size() == valueExprs.size(),
         "Expected the number of method arguments to match the number of default values.");
-    return IntStream.range(0, rpcMethodArgVarExprs.size())
+    return IntStream.range(0, variableExprs.size())
         .mapToObj(
             i ->
                 AssignmentExpr.builder()
-                    .setVariableExpr(
-                        rpcMethodArgVarExprs.get(i).toBuilder().setIsDecl(true).build())
-                    .setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
+                    .setVariableExpr(variableExprs.get(i).toBuilder().setIsDecl(true).build())
+                    .setValueExpr(valueExprs.get(i))
                     .build())
         .collect(Collectors.toList());
   }
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index 2b79d1dc56..a4975363e3 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -36,12 +36,12 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.junit.Before;
 import org.junit.Test;
 
 public class ServiceClientSampleCodeComposerTest {
   private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
 
+  // =======================================RPC Method Header Sample Code=======================//
   @Test
   public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() {
     FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
@@ -91,7 +91,10 @@ public void validComposeRpcMethodHeaderSampleCode_pagedUnaryRpc() {
     Map messageTypes = Parser.parseMessages(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -138,10 +141,16 @@ public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTyp
                 .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("PagedResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("PagedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     List methodArguments = Collections.emptyList();
     Method method =
         Method.builder()
@@ -171,10 +180,16 @@ public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPage
                 .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("PagedResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("PagedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     List methodArguments = Collections.emptyList();
     Method method =
         Method.builder()
@@ -219,13 +234,22 @@ public void composeUnaryRpcMethodSampleCode_resourceNameMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode resourceNameType =
         TypeNode.withReference(
             ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class));
@@ -269,13 +293,22 @@ public void composeUnaryRpcMethodSampleCode_superReferenceIsResourceNameMethodAr
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode methodArgType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -324,13 +357,22 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     Field methodArgField =
         Field.builder()
             .setName("name")
@@ -370,13 +412,22 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     Field methodArgField =
         Field.builder()
             .setName("parent")
@@ -417,13 +468,22 @@ public void composeUnaryRpcMethodSampleCode_isMessageMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode methodArgType =
         TypeNode.withReference(
             VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build());
@@ -467,13 +527,22 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     Field methodArgField =
         Field.builder()
             .setName("display_name")
@@ -481,7 +550,8 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() {
             .setResourceReference(
                 ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes"))
             .build();
-    Reference userRef = VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build();
+    Reference userRef =
+        VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build();
     Field nestFiled =
         Field.builder()
             .setName("user")
@@ -531,13 +601,22 @@ public void composeUnaryRpcMethodSampleCode_stringIsContainedInOneOfMethodArgume
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     Field methodArgField =
         Field.builder()
             .setName("content")
@@ -577,13 +656,22 @@ public void composeUnaryRpcMethodSampleCode_multipleMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     MethodArgument arg1 =
         MethodArgument.builder()
             .setName("content")
@@ -628,13 +716,22 @@ public void composeUnaryRpcMethodSampleCode_noMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoRequest").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode outputType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoResponse").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     List> signatures = Arrays.asList(Collections.emptyList());
     Method unaryMethod =
         Method.builder()
@@ -661,7 +758,10 @@ public void composeUnaryRpcMethodSampleCode_methodReturnVoid() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -706,7 +806,10 @@ public void composeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder()
@@ -776,7 +879,10 @@ public void composeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
     Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
     TypeNode clientType =
         TypeNode.withReference(
-            VaporReference.builder().setName("EchoClient").setPakkage(SHOWCASE_PACKAGE_NAME).build());
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
     TypeNode inputType =
         TypeNode.withReference(
             VaporReference.builder()

From 85c9e3ad448aa124b05546a16e7eb0481dee9fb1 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Tue, 8 Dec 2020 21:06:43 -0800
Subject: [PATCH 30/32] fix typo

---
 .../gapic/composer/ServiceClientSampleCodeComposerTest.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index a4975363e3..9d06028a17 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -213,13 +213,13 @@ public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPage
             .build();
     Field nextPageToken =
         Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
-    Message noRepeatedFiledMessage =
+    Message noRepeatedFieldMessage =
         Message.builder()
             .setName("PagedResponse")
             .setType(outputType)
             .setFields(Arrays.asList(responseField, nextPageToken))
             .build();
-    messageTypes.put("PagedResponse", noRepeatedFiledMessage);
+    messageTypes.put("PagedResponse", noRepeatedFieldMessage);
     assertThrows(
         NullPointerException.class,
         () ->

From 6d822c361aa821d3c9bae9eb2c82c369bbc9dbb0 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Tue, 8 Dec 2020 21:32:04 -0800
Subject: [PATCH 31/32] reorder parameters

---
 .../gapic/composer/ServiceClientSampleCodeComposer.java       | 4 ++--
 .../gapic/composer/ServiceClientSampleCodeComposerTest.java   | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index 51873bc05a..ffc67ddd2b 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -208,7 +208,7 @@ public static String composeRpcMethodHeaderSampleCode(
       TypeNode repeatedResponseType = repeatedPagedResultsField.type();
       return SampleCodeWriter.write(
           composeUnaryPagedRpcMethodSampleCode(
-              method, arguments, clientType, resourceNames, repeatedResponseType));
+              method, clientType, arguments, resourceNames, repeatedResponseType));
     }
     return SampleCodeWriter.write(
         composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames));
@@ -275,8 +275,8 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
   @VisibleForTesting
   static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
       Method method,
-      List arguments,
       TypeNode clientType,
+      List arguments,
       Map resourceNames,
       TypeNode repeatedResponseType) {
     VariableExpr clientVarExpr =
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index 9d06028a17..d86ec9aec6 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -860,7 +860,7 @@ public void composeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, arguments, clientType, resourceNames, repeatedResponseType));
+                method, clientType, arguments, resourceNames, repeatedResponseType));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",
@@ -911,7 +911,7 @@ public void composeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, arguments, clientType, resourceNames, repeatedResponseType));
+                method, clientType, arguments, resourceNames, repeatedResponseType));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",

From bba7c84191d699cd611708536d92096df7ad9f00 Mon Sep 17 00:00:00 2001
From: summerji 
Date: Tue, 8 Dec 2020 21:37:15 -0800
Subject: [PATCH 32/32] reorder arguments

---
 .../gapic/composer/ServiceClientSampleCodeComposer.java     | 6 +++---
 .../gapic/composer/ServiceClientSampleCodeComposerTest.java | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
index ffc67ddd2b..7211ae8ce6 100644
--- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
+++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposer.java
@@ -208,7 +208,7 @@ public static String composeRpcMethodHeaderSampleCode(
       TypeNode repeatedResponseType = repeatedPagedResultsField.type();
       return SampleCodeWriter.write(
           composeUnaryPagedRpcMethodSampleCode(
-              method, clientType, arguments, resourceNames, repeatedResponseType));
+              method, clientType, repeatedResponseType, arguments, resourceNames));
     }
     return SampleCodeWriter.write(
         composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames));
@@ -276,9 +276,9 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
   static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
       Method method,
       TypeNode clientType,
+      TypeNode repeatedResponseType,
       List arguments,
-      Map resourceNames,
-      TypeNode repeatedResponseType) {
+      Map resourceNames) {
     VariableExpr clientVarExpr =
         VariableExpr.withVariable(
             Variable.builder()
diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
index d86ec9aec6..e902ef0177 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientSampleCodeComposerTest.java
@@ -860,7 +860,7 @@ public void composeUnaryPagedRpcMethodSampleCode_multipleMethodArguments() {
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, clientType, arguments, resourceNames, repeatedResponseType));
+                method, clientType, repeatedResponseType, arguments, resourceNames));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",
@@ -911,7 +911,7 @@ public void composeUnaryPagedRpcMethodSampleCode_noMethodArguments() {
     String results =
         SampleCodeWriter.write(
             ServiceClientSampleCodeComposer.composeUnaryPagedRpcMethodSampleCode(
-                method, clientType, arguments, resourceNames, repeatedResponseType));
+                method, clientType, repeatedResponseType, arguments, resourceNames));
     String expected =
         LineFormatter.lines(
             "try (EchoClient echoClient = EchoClient.create()) {\n",