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 37758868e0..229485efe6 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 @@ -139,7 +139,8 @@ private static List createClassHeaderComments( Optional methodNameOpt = methodOpt.isPresent() ? Optional.of(methodOpt.get().name()) : Optional.empty(); Optional sampleCodeOpt = - SettingsSampleCodeComposer.composeSampleCode(methodOpt, classType); + SettingsSampleCodeComposer.composeSampleCode( + methodNameOpt, ClassNames.getServiceSettingsClassName(service), classType); return SettingsCommentComposer.createClassHeaderComments( ClassNames.getServiceClientClassName(service), service.defaultHost(), diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java index 2753fb6faf..45317be985 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposer.java @@ -218,7 +218,8 @@ private static List createClassHeaderComments( Optional methodNameOpt = methodOpt.isPresent() ? Optional.of(methodOpt.get().name()) : Optional.empty(); Optional sampleCodeOpt = - SettingsSampleCodeComposer.composeSampleCode(methodOpt, classType); + SettingsSampleCodeComposer.composeSampleCode( + methodNameOpt, ClassNames.getServiceSettingsClassName(service), classType); return SettingsCommentComposer.createClassHeaderComments( ClassNames.getServiceStubClassName(service), diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposer.java index b4ca4d73a7..9c554b0be0 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposer.java @@ -16,7 +16,6 @@ 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.PrimitiveValue; @@ -26,8 +25,6 @@ import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; -import com.google.api.generator.engine.writer.JavaWriterVisitor; -import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.utils.JavaStyle; import java.time.Duration; import java.util.Arrays; @@ -36,21 +33,15 @@ import java.util.stream.Collectors; public final class SettingsSampleCodeComposer { - // TODO(summerji): Add unit tests - private static final String BUILDER_NAME_PATTERN = "%sBuilder"; - private static final String STUB = "Stub"; - private static final String EMPTY_STRING = ""; - - public static Optional composeSampleCode(Optional methodOpt, TypeNode classType) { - if (!methodOpt.isPresent()) { + public static Optional composeSampleCode( + Optional methodNameOpt, String settingsClassName, TypeNode classType) { + if (!methodNameOpt.isPresent()) { return Optional.empty(); } - Method method = methodOpt.get(); // Initialize services settingsBuilder with newBuilder() // e.g. FoobarSettings.Builder foobarSettingsBuilder = FoobarSettings.newBuilder(); - String className = classType.reference().name(); TypeNode builderType = TypeNode.withReference( VaporReference.builder() @@ -58,34 +49,44 @@ public static Optional composeSampleCode(Optional methodOpt, Typ .setName("Builder") .setPakkage(classType.reference().pakkage()) .build()); - Variable builderVar = - Variable.builder() - .setName(getClassSettingsBuilderName(className)) - .setType(builderType) - .build(); - VariableExpr localSettingsVarExpr = VariableExpr.withVariable(builderVar); - Expr settingsBuilderExpr = + VariableExpr localSettingsVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName(JavaStyle.toLowerCamelCase(String.format("%sBuilder", settingsClassName))) + .setType(builderType) + .build()); + MethodInvocationExpr settingsBuilderMethodInvocationExpr = MethodInvocationExpr.builder() .setStaticReferenceType(classType) .setMethodName("newBuilder") .setReturnType(builderType) .build(); - Expr initLocalSettingsExpr = + AssignmentExpr initLocalSettingsExpr = AssignmentExpr.builder() .setVariableExpr(localSettingsVarExpr.toBuilder().setIsDecl(true).build()) - .setValueExpr(settingsBuilderExpr) + .setValueExpr(settingsBuilderMethodInvocationExpr) .build(); // Builder with set value method // e.g foobarSettingBuilder.fooSetting().setRetrySettings( // echoSettingsBuilder.echoSettings().getRetrySettings().toBuilder().setTotalTimeout(Duration.ofSeconds(30)).build()); - MethodInvocationExpr retrySettingsMethodExpr = + MethodInvocationExpr settingBuilderMethodInvocationExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(localSettingsVarExpr) - .setMethodName(JavaStyle.toLowerCamelCase(String.format("%sSettings", method.name()))) - .setReturnType(method.outputType()) + .setMethodName( + JavaStyle.toLowerCamelCase(String.format("%sSettings", methodNameOpt.get()))) + .build(); + MethodInvocationExpr retrySettingsArgExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(settingBuilderMethodInvocationExpr) + .setMethodName("getRetrySettings") + .build(); + retrySettingsArgExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(retrySettingsArgExpr) + .setMethodName("toBuilder") .build(); - MethodInvocationExpr timeoutArExpr = + MethodInvocationExpr ofSecondMethodInvocationExpr = MethodInvocationExpr.builder() .setStaticReferenceType( TypeNode.withReference(ConcreteReference.withClazz(Duration.class))) @@ -94,30 +95,22 @@ public static Optional composeSampleCode(Optional methodOpt, Typ ValueExpr.withValue( PrimitiveValue.builder().setType(TypeNode.INT).setValue("30").build())) .build(); - MethodInvocationExpr timeoutBuilderMethodExpr = + retrySettingsArgExpr = MethodInvocationExpr.builder() - .setExprReferenceExpr( - MethodInvocationExpr.builder() - .setExprReferenceExpr( - MethodInvocationExpr.builder() - .setExprReferenceExpr(retrySettingsMethodExpr) - .setMethodName("getRetrySettings") - .build()) - .setMethodName("toBuilder") - .build()) + .setExprReferenceExpr(retrySettingsArgExpr) .setMethodName("setTotalTimeout") - .setArguments(Arrays.asList(timeoutArExpr)) + .setArguments(ofSecondMethodInvocationExpr) .build(); - MethodInvocationExpr retrySettingsArgExpr = + retrySettingsArgExpr = MethodInvocationExpr.builder() - .setExprReferenceExpr(timeoutBuilderMethodExpr) + .setExprReferenceExpr(retrySettingsArgExpr) .setMethodName("build") .build(); - MethodInvocationExpr settingBuilderMethodExpr = + settingBuilderMethodInvocationExpr = MethodInvocationExpr.builder() - .setExprReferenceExpr(retrySettingsMethodExpr) + .setExprReferenceExpr(settingBuilderMethodInvocationExpr) .setMethodName("setRetrySettings") - .setArguments(Arrays.asList(retrySettingsArgExpr)) + .setArguments(retrySettingsArgExpr) .build(); // Initialize clientSetting with builder() method. @@ -126,7 +119,7 @@ public static Optional composeSampleCode(Optional methodOpt, Typ VariableExpr.withVariable( Variable.builder() .setType(classType) - .setName(JavaStyle.toLowerCamelCase(className).replace("Stub", "")) + .setName(JavaStyle.toLowerCamelCase(settingsClassName)) .build()); AssignmentExpr settingBuildAssignmentExpr = AssignmentExpr.builder() @@ -140,25 +133,13 @@ public static Optional composeSampleCode(Optional methodOpt, Typ .build(); List statements = - Arrays.asList(initLocalSettingsExpr, settingBuilderMethodExpr, settingBuildAssignmentExpr) + Arrays.asList( + initLocalSettingsExpr, + settingBuilderMethodInvocationExpr, + settingBuildAssignmentExpr) .stream() .map(e -> ExprStatement.withExpr(e)) .collect(Collectors.toList()); - return Optional.of(SampleCodeJavaFormatter.format(writeStatements(statements))); - } - - private static String getClassSettingsBuilderName(String className) { - return JavaStyle.toLowerCamelCase( - String.format(BUILDER_NAME_PATTERN, JavaStyle.toLowerCamelCase(className))) - .replace(STUB, EMPTY_STRING); - } - - // TODO(summerji): Refactor to use writeSampleCode method after PR#499 merged. - private static String writeStatements(List statements) { - JavaWriterVisitor visitor = new JavaWriterVisitor(); - for (Statement statement : statements) { - statement.accept(visitor); - } - return visitor.write(); + return Optional.of(SampleCodeWriter.write(statements)); } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel b/src/test/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel index f5135007ec..7a1cdbb61c 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel +++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/BUILD.bazel @@ -6,6 +6,7 @@ TESTS = [ "SampleCodeJavaFormatterTest", "SampleCodeWriterTest", "ServiceClientSampleCodeComposerTest", + "SettingsSampleCodeComposerTest", ] filegroup( diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposerTest.java new file mode 100644 index 0000000000..b7438e4732 --- /dev/null +++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SettingsSampleCodeComposerTest.java @@ -0,0 +1,80 @@ +// 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 static junit.framework.Assert.assertEquals; + +import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.VaporReference; +import com.google.api.generator.testutils.LineFormatter; +import java.util.Optional; +import org.junit.Test; + +public class SettingsSampleCodeComposerTest { + @Test + public void composeSettingsSampleCode_noMethods() { + TypeNode classType = TypeNode.withReference(VaporReference.builder() + .setName("EchoSettings") + .setPakkage("com.google.showcase.v1beta1") + .build()); + Optional results = SettingsSampleCodeComposer.composeSampleCode(Optional.empty(), "EchoSettings", classType); + assertEquals(results, Optional.empty()); + } + + @Test + public void composeSettingsSampleCode_serviceSettingsClass() { + TypeNode classType = TypeNode.withReference(VaporReference.builder() + .setName("EchoSettings") + .setPakkage("com.google.showcase.v1beta1") + .build()); + Optional results = SettingsSampleCodeComposer.composeSampleCode(Optional.of("Echo"), "EchoSettings", classType); + String expected = LineFormatter.lines( + "EchoSettings.Builder echoSettingsBuilder = EchoSettings.newBuilder();\n", + "echoSettingsBuilder\n", + " .echoSettings()\n", + " .setRetrySettings(\n", + " echoSettingsBuilder\n", + " .echoSettings()\n", + " .getRetrySettings()\n", + " .toBuilder()\n", + " .setTotalTimeout(Duration.ofSeconds(30))\n", + " .build());\n", + "EchoSettings echoSettings = echoSettingsBuilder.build();"); + assertEquals(results.get(), expected); + } + + @Test + public void composeSettingsSampleCode_serviceStubClass() { + TypeNode classType = TypeNode.withReference(VaporReference.builder() + .setName("EchoStubSettings") + .setPakkage("com.google.showcase.v1beta1") + .build()); + Optional results = SettingsSampleCodeComposer.composeSampleCode(Optional.of("Echo"), "EchoSettings", classType); + String expected = LineFormatter.lines( + "EchoStubSettings.Builder echoSettingsBuilder = EchoStubSettings.newBuilder();\n", + "echoSettingsBuilder\n", + " .echoSettings()\n", + " .setRetrySettings(\n", + " echoSettingsBuilder\n", + " .echoSettings()\n", + " .getRetrySettings()\n", + " .toBuilder()\n", + " .setTotalTimeout(Duration.ofSeconds(30))\n", + " .build());\n", + "EchoStubSettings echoSettings = echoSettingsBuilder.build();"); + assertEquals(results.get(), expected); + } + +} diff --git a/test/integration/goldens/logging/ConfigServiceV2StubSettings.java b/test/integration/goldens/logging/ConfigServiceV2StubSettings.java index 9665b4956b..353b972407 100644 --- a/test/integration/goldens/logging/ConfigServiceV2StubSettings.java +++ b/test/integration/goldens/logging/ConfigServiceV2StubSettings.java @@ -92,18 +92,18 @@ *

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

{@code
- * ConfigServiceV2StubSettings.Builder configServiceV2SettingsBuilder =
+ * ConfigServiceV2StubSettings.Builder configSettingsBuilder =
  *     ConfigServiceV2StubSettings.newBuilder();
- * configServiceV2SettingsBuilder
+ * configSettingsBuilder
  *     .getBucketSettings()
  *     .setRetrySettings(
- *         configServiceV2SettingsBuilder
+ *         configSettingsBuilder
  *             .getBucketSettings()
  *             .getRetrySettings()
  *             .toBuilder()
  *             .setTotalTimeout(Duration.ofSeconds(30))
  *             .build());
- * ConfigServiceV2StubSettings configServiceV2Settings = configServiceV2SettingsBuilder.build();
+ * ConfigServiceV2StubSettings configSettings = configSettingsBuilder.build();
  * }
*/ @Generated("by gapic-generator-java") diff --git a/test/integration/goldens/logging/LoggingServiceV2StubSettings.java b/test/integration/goldens/logging/LoggingServiceV2StubSettings.java index e62a198503..c956de3687 100644 --- a/test/integration/goldens/logging/LoggingServiceV2StubSettings.java +++ b/test/integration/goldens/logging/LoggingServiceV2StubSettings.java @@ -90,18 +90,18 @@ *

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

{@code
- * LoggingServiceV2StubSettings.Builder loggingServiceV2SettingsBuilder =
+ * LoggingServiceV2StubSettings.Builder loggingSettingsBuilder =
  *     LoggingServiceV2StubSettings.newBuilder();
- * loggingServiceV2SettingsBuilder
+ * loggingSettingsBuilder
  *     .deleteLogSettings()
  *     .setRetrySettings(
- *         loggingServiceV2SettingsBuilder
+ *         loggingSettingsBuilder
  *             .deleteLogSettings()
  *             .getRetrySettings()
  *             .toBuilder()
  *             .setTotalTimeout(Duration.ofSeconds(30))
  *             .build());
- * LoggingServiceV2StubSettings loggingServiceV2Settings = loggingServiceV2SettingsBuilder.build();
+ * LoggingServiceV2StubSettings loggingSettings = loggingSettingsBuilder.build();
  * }
*/ @Generated("by gapic-generator-java") diff --git a/test/integration/goldens/logging/MetricsServiceV2StubSettings.java b/test/integration/goldens/logging/MetricsServiceV2StubSettings.java index c3b691f2c6..b8f5293bea 100644 --- a/test/integration/goldens/logging/MetricsServiceV2StubSettings.java +++ b/test/integration/goldens/logging/MetricsServiceV2StubSettings.java @@ -75,18 +75,18 @@ *

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

{@code
- * MetricsServiceV2StubSettings.Builder metricsServiceV2SettingsBuilder =
+ * MetricsServiceV2StubSettings.Builder metricsSettingsBuilder =
  *     MetricsServiceV2StubSettings.newBuilder();
- * metricsServiceV2SettingsBuilder
+ * metricsSettingsBuilder
  *     .getLogMetricSettings()
  *     .setRetrySettings(
- *         metricsServiceV2SettingsBuilder
+ *         metricsSettingsBuilder
  *             .getLogMetricSettings()
  *             .getRetrySettings()
  *             .toBuilder()
  *             .setTotalTimeout(Duration.ofSeconds(30))
  *             .build());
- * MetricsServiceV2StubSettings metricsServiceV2Settings = metricsServiceV2SettingsBuilder.build();
+ * MetricsServiceV2StubSettings metricsSettings = metricsSettingsBuilder.build();
  * }
*/ @Generated("by gapic-generator-java")