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 02ff960025..8ed7331724 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 @@ -119,7 +119,7 @@ public GapicClass generate(Service service, Map messageTypes) { ClassDefinition classDef = ClassDefinition.builder() .setHeaderCommentStatements( - ServiceClientCommentComposer.createClassHeaderComments(service)) + ServiceClientCommentComposer.createClassHeaderComments(service, types)) .setPackageString(pakkage) .setAnnotations(createClassAnnotations(types)) .setScope(ScopeNode.PUBLIC) 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 1a0f8f2b0f..9aec8b8184 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 @@ -17,6 +17,7 @@ import com.google.api.generator.engine.ast.CommentStatement; import com.google.api.generator.engine.ast.JavaDocComment; import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.gapic.composer.samplecode.ServiceClientCommentSampleCodeComposer; import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.Service; @@ -25,6 +26,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -103,7 +105,8 @@ class ServiceClientCommentComposer { "Returns the OperationsClient that can be used to query the status of a long-running" + " operation returned by another API method call."); - static List createClassHeaderComments(Service service) { + static List createClassHeaderComments( + Service service, Map types) { JavaDocComment.Builder classHeaderJavadocBuilder = JavaDocComment.builder(); if (service.hasDescription()) { classHeaderJavadocBuilder = @@ -134,7 +137,9 @@ static List createClassHeaderComments(Service service) { SERVICE_DESCRIPTION_CUSTOMIZE_SUMMARY_PATTERN, String.format("%sSettings", JavaStyle.toUpperCamelCase(service.name())))); classHeaderJavadocBuilder.addParagraph(SERVICE_DESCRIPTION_CREDENTIALS_SUMMARY_STRING); - // TODO(summerji): Add credentials' customization sample code here. + classHeaderJavadocBuilder.addSampleCode( + ServiceClientCommentSampleCodeComposer.composeClassHeaderCredentialsSampleCode( + service, types)); classHeaderJavadocBuilder.addParagraph(SERVICE_DESCRIPTION_ENDPOINT_SUMMARY_STRING); // TODO(summerji): Add endpoint customization sample code here. diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel index 54f203fff4..9dcaf7ab63 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel @@ -18,5 +18,6 @@ java_library( "//src/main/java/com/google/api/generator/gapic/model", "//src/main/java/com/google/api/generator/gapic/utils", "@google_java_format_all_deps//jar", + "@com_google_api_gax_java//gax", ], ) diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCommentSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCommentSampleCodeComposer.java new file mode 100644 index 0000000000..57407e1c17 --- /dev/null +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCommentSampleCodeComposer.java @@ -0,0 +1,115 @@ +// 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.samplecode; + +import com.google.api.gax.core.FixedCredentialsProvider; +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.Statement; +import com.google.api.generator.engine.ast.StringObjectValue; +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.ValueExpr; +import com.google.api.generator.engine.ast.Variable; +import com.google.api.generator.engine.ast.VariableExpr; +import com.google.api.generator.engine.writer.JavaWriterVisitor; +import com.google.api.generator.gapic.model.Service; +import com.google.api.generator.gapic.utils.JavaStyle; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.Map; + +public class ServiceClientCommentSampleCodeComposer { + + private static final String SETTINGS_NAME_PATTERN = "%sSettings"; + private static final String CLASS_NAME_PATTERN = "%sClient"; + + public static String composeClassHeaderCredentialsSampleCode(Service service, Map types) { + String settingsVarName = JavaStyle.toLowerCamelCase(getSettingsName(service.name())); + TypeNode settingsVarType = types.get(getSettingsName(service.name())); + VariableExpr settingsVarExpr = VariableExpr.withVariable( + Variable.builder() + .setName(settingsVarName) + .setType(settingsVarType) + .build()); + MethodInvocationExpr newBuilderMethodExpr = + MethodInvocationExpr.builder() + .setStaticReferenceType(settingsVarType) + .setMethodName("newBuilder") + .build(); + TypeNode fixedCredentialProvideType = TypeNode.withReference( + ConcreteReference.withClazz(FixedCredentialsProvider.class) + ); + MethodInvocationExpr credentialArgExpr = + MethodInvocationExpr.builder() + .setStaticReferenceType(fixedCredentialProvideType) + .setArguments(ValueExpr.withValue(StringObjectValue.withValue("myCredentials"))) + .setMethodName("create") + .build(); + MethodInvocationExpr credentialsMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(newBuilderMethodExpr) + .setArguments(credentialArgExpr) + .setMethodName("setCredentialsProvider") + .build(); + MethodInvocationExpr buildMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(credentialsMethodExpr) + .setReturnType(settingsVarType) + .setMethodName("build") + .build(); + + Expr initSettingsVarExpr = + AssignmentExpr.builder() + .setVariableExpr(settingsVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(buildMethodExpr) + .build(); + + String className = JavaStyle.toLowerCamelCase(getClientClassName(service.name())); + TypeNode classType = types.get(getClientClassName(service.name())); + VariableExpr clientVarExpr = VariableExpr.withVariable(Variable.builder().setName(className).setType(classType).build()); + MethodInvocationExpr createMethodExpr = MethodInvocationExpr.builder().setStaticReferenceType(classType).setArguments(settingsVarExpr).setMethodName("create").setReturnType(classType).build(); + Expr initClientVarExpr = AssignmentExpr.builder() + .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(createMethodExpr) + .build(); + + return writeSampleCode(Arrays.asList(initSettingsVarExpr, initClientVarExpr)); + } + + private static String getClientClassName(String serviceName) { + return String.format(CLASS_NAME_PATTERN, serviceName); + } + + private static String getSettingsName(String serviceName) { + return String.format(SETTINGS_NAME_PATTERN, serviceName); + } + + private static String writeSampleCode(List exprs) { + List statements = + exprs + .stream() + .map(e -> ExprStatement.withExpr(e)) + .collect(Collectors.toList()); + JavaWriterVisitor visitor = new JavaWriterVisitor(); + for (Statement statement : statements) { + statement.accept(visitor); + } + return SampleCodeJavaFormatter.format(visitor.write()); + } +} diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsCommentSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsCommentSampleCodeComposer.java index 6c27ec9fd8..f8fdc4b787 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsCommentSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsCommentSampleCodeComposer.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.stream.Collectors; -public final class SettingsCommentSampleCodeComposer { +public class SettingsCommentSampleCodeComposer { private static final String BUILDER_NAME_PATTERN = "%sBuilder"; private static final String STUB = "Stub"; 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 20a193853e..71d187905d 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 @@ -63,6 +63,14 @@ import javax.annotation.Generated; * *

To customize credentials: * + *


+ * EchoSettings echoSettings =
+ *     EchoSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * EchoClient echoClient = EchoClient.create(echoSettings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi 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 0f48757f2b..d238ecc2dd 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 @@ -53,6 +53,14 @@ import javax.annotation.Generated; * *

To customize credentials: * + *


+ * IdentitySettings identitySettings =
+ *     IdentitySettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * IdentityClient identityClient = IdentityClient.create(identitySettings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index 103843b065..d2fe918308 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -75,6 +75,14 @@ * *

To customize credentials: * + *


+ * AssetServiceSettings assetServiceSettings =
+ *     AssetServiceSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * AssetServiceClient assetServiceClient = AssetServiceClient.create(assetServiceSettings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi diff --git a/test/integration/goldens/logging/ConfigServiceV2Client.java b/test/integration/goldens/logging/ConfigServiceV2Client.java index b6516172fc..a10e504f57 100644 --- a/test/integration/goldens/logging/ConfigServiceV2Client.java +++ b/test/integration/goldens/logging/ConfigServiceV2Client.java @@ -73,6 +73,15 @@ * *

To customize credentials: * + *


+ * ConfigServiceV2Settings configServiceV2Settings =
+ *     ConfigServiceV2Settings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * ConfigServiceV2Client configServiceV2Client =
+ *     ConfigServiceV2Client.create(configServiceV2Settings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi diff --git a/test/integration/goldens/logging/LoggingServiceV2Client.java b/test/integration/goldens/logging/LoggingServiceV2Client.java index d90cbfadf6..baa466e94b 100644 --- a/test/integration/goldens/logging/LoggingServiceV2Client.java +++ b/test/integration/goldens/logging/LoggingServiceV2Client.java @@ -75,6 +75,15 @@ * *

To customize credentials: * + *


+ * LoggingServiceV2Settings loggingServiceV2Settings =
+ *     LoggingServiceV2Settings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * LoggingServiceV2Client loggingServiceV2Client =
+ *     LoggingServiceV2Client.create(loggingServiceV2Settings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi diff --git a/test/integration/goldens/logging/MetricsServiceV2Client.java b/test/integration/goldens/logging/MetricsServiceV2Client.java index 19f6aef98d..a92299773e 100644 --- a/test/integration/goldens/logging/MetricsServiceV2Client.java +++ b/test/integration/goldens/logging/MetricsServiceV2Client.java @@ -72,6 +72,15 @@ * *

To customize credentials: * + *


+ * MetricsServiceV2Settings metricsServiceV2Settings =
+ *     MetricsServiceV2Settings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * MetricsServiceV2Client metricsServiceV2Client =
+ *     MetricsServiceV2Client.create(metricsServiceV2Settings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index c807b6dd8a..01af3ad018 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -95,6 +95,14 @@ * *

To customize credentials: * + *


+ * CloudRedisSettings cloudRedisSettings =
+ *     CloudRedisSettings.newBuilder()
+ *         .setCredentialsProvider(FixedCredentialsProvider.create("myCredentials"))
+ *         .build();
+ * CloudRedisClient cloudRedisClient = CloudRedisClient.create(cloudRedisSettings);
+ * 
+ * *

To customize the endpoint: */ @BetaApi