From 04095aca1a12f52efe46668bc3690fd10baa7c46 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 13:55:01 -0800 Subject: [PATCH 01/19] Flattern the createVariableExpr wrapper --- .../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 4bec878c6770d0e12524b3d87558d890c037a8d2 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 13:32:59 -0800 Subject: [PATCH 02/19] 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 5f6a00f4d8..da83ca90d6 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 9bdfe9e40f..b847a06a80 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 @@ -55,6 +55,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; @@ -93,7 +94,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 bd2bbe0a7bdd37746bea3b4441e897992ef4a4af Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 15:14:38 -0800 Subject: [PATCH 03/19] 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 da83ca90d6..73d2ddcb26 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 b847a06a80..9bdfe9e40f 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 @@ -55,7 +55,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; @@ -94,8 +93,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 b27edf3d42b24d86ffb4f72d5dbaa03d8b3adfc8 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 17:32:30 -0800 Subject: [PATCH 04/19] 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 73d2ddcb26..c5aacb18cc 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 a14fb047211abe55cae4b4fd5b4a3503d39ea50b Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 09:48:30 -0800 Subject: [PATCH 05/19] 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 c5aacb18cc..7979dc74ed 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 0f537bce4dbd8a0de35d55480943d01171b82e00 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 25 Nov 2020 17:21:08 -0800 Subject: [PATCH 06/19] 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 7979dc74ed..9c8bd58333 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 c4745c9892..91d220b560 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 @@ -155,6 +155,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 */ @@ -168,6 +177,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 */ @@ -178,6 +196,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 */ @@ -189,6 +216,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 */ @@ -199,6 +235,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 */ @@ -209,6 +254,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 */ @@ -219,6 +273,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 091e335eee..8d89010dcd 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 @@ -125,6 +125,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 @@ -142,6 +153,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 @@ -189,6 +217,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 */ @@ -200,6 +237,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 */ @@ -240,6 +286,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 */ @@ -253,6 +308,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 dad79b7391..eceed3086c 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -246,6 +246,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 @@ -282,6 +291,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 @@ -297,6 +315,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 @@ -332,6 +359,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"). @@ -367,6 +403,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. @@ -402,6 +447,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 @@ -419,6 +473,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 e9d2780f0b..705d22a96a 100644 --- a/test/integration/goldens/library/LibraryServiceClient.java +++ b/test/integration/goldens/library/LibraryServiceClient.java @@ -171,6 +171,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 */ @@ -204,6 +213,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 */ @@ -217,6 +235,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 */ @@ -285,6 +312,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 */ @@ -300,6 +336,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 */ @@ -338,6 +383,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 @@ -360,6 +415,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 @@ -382,6 +447,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 @@ -404,6 +479,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 @@ -449,6 +534,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 @@ -466,6 +561,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 @@ -500,6 +605,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 */ @@ -513,6 +627,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 */ @@ -636,6 +759,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 */ @@ -672,6 +804,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 @@ -690,6 +832,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 @@ -708,6 +860,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 @@ -726,6 +888,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 14f8749dc1..edf1db5bb3 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -484,6 +484,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]" @@ -504,6 +513,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]" @@ -545,6 +563,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]" @@ -569,6 +597,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]" @@ -593,6 +631,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]" @@ -617,6 +665,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]" @@ -641,6 +699,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]" @@ -690,6 +758,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]" @@ -718,6 +796,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]" @@ -743,6 +831,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]" @@ -781,6 +880,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]" @@ -845,6 +955,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]" @@ -867,6 +986,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]" @@ -1023,6 +1151,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]" @@ -1043,6 +1180,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]" @@ -1082,6 +1228,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]" @@ -1104,6 +1260,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]" @@ -1126,6 +1292,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]" @@ -1148,6 +1324,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]" @@ -1170,6 +1356,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]" @@ -1211,6 +1407,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]" @@ -1242,6 +1449,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]" @@ -1294,6 +1512,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]" @@ -1314,6 +1541,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 8b80772613..242f68f9cd 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -164,6 +164,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]" @@ -186,6 +195,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]" @@ -231,6 +249,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]" @@ -293,6 +324,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 ab7d4fde63..e9d9aa4465 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -215,6 +215,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 @@ -231,6 +240,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 @@ -266,6 +284,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. @@ -286,6 +314,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. @@ -324,6 +362,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 @@ -345,6 +393,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 @@ -384,6 +442,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 @@ -400,6 +467,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 a65989a9f7..a772ac684c 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -291,6 +291,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. @@ -308,6 +317,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 08e85b0097c5a48d373cefae7e39d73ffce12d88 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 1 Dec 2020 00:04:03 -0800 Subject: [PATCH 07/19] 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 34ba6bbabdbe4f58c7f0b4234c8f04ac843ec155 Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 16:34:39 -0800 Subject: [PATCH 08/19] 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 91d220b560..306ef6ef4f 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 @@ -145,6 +145,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 */ @@ -239,8 +247,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());
    * }
    * }
* @@ -258,8 +266,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 8d89010dcd..c4a5f23048 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,10 +129,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);
    * }
    * }
* @@ -157,7 +157,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;
@@ -166,7 +166,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);
    * }
    * }
* @@ -241,8 +247,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());
    * }
    * }
* @@ -312,8 +318,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 eceed3086c..a734e81a92 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -319,8 +319,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());
    * }
    * }
* @@ -477,8 +477,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 edf1db5bb3..aab1689bb5 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -517,8 +517,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());
    * }
    * }
* @@ -703,9 +703,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);
    * }
    * }
* @@ -800,9 +800,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);
    * }
    * }
* @@ -884,10 +884,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);
    * }
    * }
* @@ -990,8 +990,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());
    * }
    * }
* @@ -1184,8 +1184,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());
    * }
    * }
* @@ -1360,9 +1360,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);
    * }
    * }
* @@ -1453,10 +1453,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);
    * }
    * }
* @@ -1545,8 +1545,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 242f68f9cd..7a8c59ef32 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -199,8 +199,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());
    * }
    * }
* @@ -328,12 +328,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 e9d9aa4465..2e7d2bc60f 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -244,8 +244,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());
    * }
    * }
* @@ -318,9 +318,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);
    * }
    * }
* @@ -397,9 +397,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);
    * }
    * }
* @@ -471,8 +471,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 a772ac684c..943c5559a3 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -321,8 +321,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 d48478051bc8551065b583b618fd2c0ad5668f8b Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 17:34:59 -0800 Subject: [PATCH 09/19] 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 0c541d0773316892a7cc63213bf2b0adb1f0bf1c Mon Sep 17 00:00:00 2001 From: summerji Date: Wed, 2 Dec 2020 17:50:09 -0800 Subject: [PATCH 10/19] 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 c4a4861960833e7ca0b5ae518f644040897cd327 Mon Sep 17 00:00:00 2001 From: Summer Ji Date: Wed, 2 Dec 2020 17:53:06 -0800 Subject: [PATCH 11/19] 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 9cf483870806503f06a5d047090fb11ac2acccef Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 3 Dec 2020 18:39:35 -0800 Subject: [PATCH 12/19] 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 9c8bd58333..401dd7d47a 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 37dfb46f69..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 { - private static String RESPONSE = "response"; 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 306ef6ef4f..cedfec7ba7 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 @@ -247,8 +247,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);
    * }
    * }
* @@ -266,8 +266,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 c4a5f23048..86866c569e 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,10 +129,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);
    * }
    * }
* @@ -157,7 +157,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;
@@ -166,13 +166,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);
    * }
    * }
* @@ -247,8 +241,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);
    * }
    * }
* @@ -318,8 +312,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 a734e81a92..cd6b66765b 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -319,8 +319,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);
    * }
    * }
* @@ -477,8 +477,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 aab1689bb5..8c7101e48a 100644 --- a/test/integration/goldens/logging/ConfigClient.java +++ b/test/integration/goldens/logging/ConfigClient.java @@ -517,8 +517,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);
    * }
    * }
* @@ -703,9 +703,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);
    * }
    * }
* @@ -800,9 +800,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);
    * }
    * }
* @@ -884,10 +884,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);
    * }
    * }
* @@ -990,8 +990,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);
    * }
    * }
* @@ -1184,8 +1184,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);
    * }
    * }
* @@ -1360,9 +1360,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);
    * }
    * }
* @@ -1453,10 +1454,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);
    * }
    * }
* @@ -1545,8 +1546,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 7a8c59ef32..6073abdef6 100644 --- a/test/integration/goldens/logging/LoggingClient.java +++ b/test/integration/goldens/logging/LoggingClient.java @@ -199,8 +199,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);
    * }
    * }
* @@ -328,12 +328,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 2e7d2bc60f..e7867372f8 100644 --- a/test/integration/goldens/logging/MetricsClient.java +++ b/test/integration/goldens/logging/MetricsClient.java @@ -244,8 +244,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);
    * }
    * }
* @@ -318,9 +318,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);
    * }
    * }
* @@ -397,9 +397,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);
    * }
    * }
* @@ -471,8 +471,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 943c5559a3..6fe63069e7 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -321,8 +321,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 febd57686c5c5784080a3c495fe29c201d672fc5 Mon Sep 17 00:00:00 2001 From: summerji Date: Thu, 3 Dec 2020 18:41:50 -0800 Subject: [PATCH 13/19] 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 7c424253e60ccac4d5d9b6c3cdbf0017724de95a Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 11:00:41 -0800 Subject: [PATCH 14/19] 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 31337a5340ba5272cd93b6804f100346e210dae5 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:43:09 -0800 Subject: [PATCH 15/19] rebase master changes --- .../ServiceClientSampleCodeComposer.java | 1 + .../ServiceClientSampleCodeComposerTest.java | 30 ++++++++++++++++++- .../composer/goldens/IdentityClient.golden | 4 +-- .../goldens/library/LibraryServiceClient.java | 8 ++--- 4 files changed, 36 insertions(+), 7 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 babf686ac6..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 @@ -317,3 +317,4 @@ 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/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 35dc9c62e9f2d40eeddd110a1cefbdedfa5f9db3 Mon Sep 17 00:00:00 2001 From: summerji Date: Fri, 4 Dec 2020 18:50:39 -0800 Subject: [PATCH 16/19] 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 9595ffba2a5b9302192b738f48eb27c0d72f7562 Mon Sep 17 00:00:00 2001 From: summerji Date: Sat, 5 Dec 2020 17:04:34 -0800 Subject: [PATCH 17/19] 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 9db7a92c44444a50f4e5a50e560153eaafc6b570 Mon Sep 17 00:00:00 2001 From: summerji Date: Mon, 7 Dec 2020 20:51:52 -0800 Subject: [PATCH 18/19] 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 bf5e7e89437c18568f20addc5cde5fe5ce180d86 Mon Sep 17 00:00:00 2001 From: summerji Date: Tue, 8 Dec 2020 16:29:15 -0800 Subject: [PATCH 19/19] 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()