diff --git a/run.sh b/run.sh index 08e67c8c4d..46572fe76c 100755 --- a/run.sh +++ b/run.sh @@ -5,7 +5,7 @@ # Usage example here: : << 'EXAMPLE' DIR=~/dev/googleapis/google/showcase/v1beta1 - ./run.sh --g ~/dev/googleapis --p "$DIR"-s "$DIR/showcase_grpc_config.json" + ./run.sh --g ~/dev/googleapis --p "$DIR"-s "$DIR/showcase_grpc_service_config.json" EXAMPLE source gbash.sh diff --git a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel index e4d8b12f9e..d1847bc155 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel @@ -13,6 +13,7 @@ java_library( deps = [ "//:longrunning_java_proto", "//:monitored_resource_java_proto", + "//:service_config_java_proto", "//src/main/java/com/google/api/generator/engine/ast", "//src/main/java/com/google/api/generator/gapic:status_java_proto", "//src/main/java/com/google/api/generator/gapic/model", 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 15aed08d4d..f54150735c 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 @@ -24,27 +24,31 @@ import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.utils.ApacheLicense; import com.google.common.annotations.VisibleForTesting; +import io.grpc.serviceconfig.ServiceConfig; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class Composer { public static List composeServiceClasses(GapicContext context) { List clazzes = new ArrayList<>(); for (Service service : context.services()) { - clazzes.addAll(generateServiceClasses(service, context.messages())); + clazzes.addAll(generateServiceClasses(service, context.serviceConfig(), context.messages())); } clazzes.addAll(generateResourceNameHelperClasses(context.helperResourceNames())); return addApacheLicense(clazzes); } public static List generateServiceClasses( - @Nonnull Service service, @Nonnull Map messageTypes) { + @Nonnull Service service, + @Nullable ServiceConfig serviceConfig, + @Nonnull Map messageTypes) { List clazzes = new ArrayList<>(); - clazzes.addAll(generateStubClasses(service, messageTypes)); + clazzes.addAll(generateStubClasses(service, serviceConfig, messageTypes)); clazzes.addAll(generateClientSettingsClasses(service, messageTypes)); clazzes.addAll(generateMocksAndTestClasses(service, messageTypes)); // TODO(miraleung): Generate test classes. @@ -60,10 +64,11 @@ public static List generateResourceNameHelperClasses( } public static List generateStubClasses( - Service service, Map messageTypes) { + Service service, ServiceConfig serviceConfig, Map messageTypes) { List clazzes = new ArrayList<>(); clazzes.add(ServiceStubClassComposer.instance().generate(service, messageTypes)); - clazzes.add(generateStubServiceSettings(service)); + clazzes.add( + ServiceStubSettingsClassComposer.instance().generate(service, serviceConfig, messageTypes)); clazzes.add(GrpcServiceCallableFactoryClassComposer.instance().generate(service, messageTypes)); clazzes.add(GrpcServiceStubClassComposer.instance().generate(service, messageTypes)); return clazzes; @@ -86,12 +91,6 @@ public static List generateMocksAndTestClasses( return clazzes; } - /** ====================== STUB CLASSES ==================== */ - private static GapicClass generateStubServiceSettings(Service service) { - return generateGenericClass( - Kind.STUB, String.format("%sStubSettings", service.name()), service); - } - /** ====================== HELPERS ==================== */ // TODO(miraleung): Add method list. private static GapicClass generateGenericClass(Kind kind, String name, Service service) { 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 30e68c260e..f2d4477511 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 @@ -75,6 +75,7 @@ import com.google.common.collect.Lists; import com.google.longrunning.Operation; import com.google.protobuf.Empty; +import io.grpc.serviceconfig.ServiceConfig; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -85,7 +86,8 @@ import javax.annotation.Generated; import org.threeten.bp.Duration; -public class ServiceStubSettingsClassComposer implements ClassComposer { +// TODO(miraleung): Refactor ClassComposer's interface. +public class ServiceStubSettingsClassComposer { private static final String CLASS_NAME_PATTERN = "%sStubSettings"; private static final String SLASH = "/"; private static final String LEFT_BRACE = "{"; @@ -104,8 +106,8 @@ public static ServiceStubSettingsClassComposer instance() { return INSTANCE; } - @Override - public GapicClass generate(Service service, Map ignore) { + public GapicClass generate( + Service service, ServiceConfig serviceConfig, Map messageTypes) { String pakkage = String.format("%s.stub", service.pakkage()); Map types = createDynamicTypes(service, pakkage); Map classMemberVarExprs = createClassMemberVarExprs(service, types); diff --git a/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel b/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel index 2460f46eed..e0106a3c27 100644 --- a/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel +++ b/src/main/java/com/google/api/generator/gapic/model/BUILD.bazel @@ -11,6 +11,7 @@ java_library( ":model_files", ], deps = [ + "//:service_config_java_proto", "//src/main/java/com/google/api/generator:autovalue", "//src/main/java/com/google/api/generator/engine/ast", "//src/main/java/com/google/api/generator/gapic/utils", diff --git a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java index 15cf8bb012..0d894884b9 100644 --- a/src/main/java/com/google/api/generator/gapic/model/GapicContext.java +++ b/src/main/java/com/google/api/generator/gapic/model/GapicContext.java @@ -18,9 +18,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import io.grpc.serviceconfig.ServiceConfig; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; @AutoValue public abstract class GapicContext { @@ -34,6 +36,9 @@ public abstract class GapicContext { public abstract ImmutableSet helperResourceNames(); + @Nullable + public abstract ServiceConfig serviceConfig(); + public static Builder builder() { return new AutoValue_GapicContext.Builder(); } @@ -48,6 +53,8 @@ public abstract static class Builder { public abstract Builder setHelperResourceNames(Set helperResourceNames); + public abstract Builder setServiceConfig(ServiceConfig serviceConfig); + public abstract GapicContext build(); } } diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index db90210655..f03079882d 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -46,6 +46,7 @@ import com.google.protobuf.Descriptors.MethodDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; +import io.grpc.serviceconfig.ServiceConfig; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -69,9 +70,11 @@ public GapicParserException(String errorMessage) { } public static GapicContext parse(CodeGeneratorRequest request) { - // TODO(miraleung): Actually parse these files. - Optional jsonConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request); - String jsonConfigPath = jsonConfigPathOpt.isPresent() ? jsonConfigPathOpt.get() : null; + Optional serviceConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request); + String serviceConfigPath = serviceConfigPathOpt.isPresent() ? serviceConfigPathOpt.get() : null; + Optional serviceConfigOpt = ServiceConfigParser.parseFile(serviceConfigPath); + + // TODO(miraleung): Actually parse the yaml file. Optional gapicYamlConfigPathOpt = PluginArgumentParser.parseGapicYamlConfigPath(request); String gapicYamlConfigPath = @@ -91,6 +94,7 @@ public static GapicContext parse(CodeGeneratorRequest request) { .setMessages(messages) .setResourceNames(resourceNames) .setHelperResourceNames(outputArgResourceNames) + .setServiceConfig(serviceConfigOpt.isPresent() ? serviceConfigOpt.get() : null) .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 1f13280759..a0fc9e4a60 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,8 +22,12 @@ filegroup( [java_test( name = test_name, srcs = ["{0}.java".format(test_name)], + data = [ + "//src/test/java/com/google/api/generator/gapic/testdata:service_config_files", + ], test_class = "com.google.api.generator.gapic.composer.{0}".format(test_name), deps = [ + "//:service_config_java_proto", "//src/main/java/com/google/api/generator/engine/ast", "//src/main/java/com/google/api/generator/engine/writer", "//src/main/java/com/google/api/generator/gapic/composer", diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java index df95e95ede..ed59b109f1 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceStubSettingsClassComposerTest.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.composer; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; import com.google.api.generator.engine.writer.JavaWriterVisitor; import com.google.api.generator.gapic.model.GapicClass; @@ -22,17 +23,25 @@ import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.model.Service; import com.google.api.generator.gapic.protoparser.Parser; +import com.google.api.generator.gapic.protoparser.ServiceConfigParser; import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.ServiceDescriptor; import com.google.showcase.v1beta1.EchoOuterClass; +import io.grpc.serviceconfig.ServiceConfig; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.junit.Before; import org.junit.Test; public class ServiceStubSettingsClassComposerTest { + private static final String JSON_DIRECTORY = + "src/test/java/com/google/api/generator/gapic/testdata/"; + private ServiceDescriptor echoService; private FileDescriptor echoFileDescriptor; @@ -51,9 +60,16 @@ public void generateServiceClasses() { List services = Parser.parseService(echoFileDescriptor, messageTypes, resourceNames, outputResourceNames); + String jsonFilename = "showcase_grpc_service_config.json"; + Path jsonPath = Paths.get(JSON_DIRECTORY, jsonFilename); + Optional configOpt = ServiceConfigParser.parseFile(jsonPath.toString()); + assertTrue(configOpt.isPresent()); + ServiceConfig config = configOpt.get(); + Service echoProtoService = services.get(0); GapicClass clazz = - ServiceStubSettingsClassComposer.instance().generate(echoProtoService, messageTypes); + ServiceStubSettingsClassComposer.instance() + .generate(echoProtoService, config, messageTypes); JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor);