Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ggj][codegen] feat: pipe ServiceConfig into ServiceStubSettings #203

Merged
merged 3 commits into from
Aug 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,24 @@ java_proto_library(
],
)

java_proto_library(
name = "rpc_java_proto",
visibility = ["//:__subpackages__"],
deps = [
"@com_google_googleapis//google/rpc:code_proto",
"@com_google_googleapis//google/rpc:error_details_proto",
"@com_google_googleapis//google/rpc:status_proto",
],
)

java_proto_library(
name = "service_config_java_proto",
visibility = ["//:__subpackages__"],
deps = [
"@io_grpc_proto//:service_config_proto",
],
)

# ============= Binary targets ================

java_binary(
Expand Down
9 changes: 9 additions & 0 deletions repositories.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,15 @@ def com_google_api_codegen_repositories():
strip_prefix = "grpc-java-%s" % _io_grpc_version,
)

# grpc-proto doesn't have releases, so we use hashes instead.
_io_grpc_proto_prefix = "0020624375a8ee4c7dd9b3e513e443b90bc28990" # Aug. 20, 2020.
_maybe(
http_archive,
name = "io_grpc_proto",
urls = ["https://github.com/grpc/grpc-proto/archive/%s.zip" % _io_grpc_proto_prefix],
strip_prefix = "grpc-proto-%s" % _io_grpc_proto_prefix,
)

def _maybe(repo_rule, name, strip_repo_prefix = "", **kwargs):
if not name.startswith(strip_repo_prefix):
return
Expand Down
2 changes: 1 addition & 1 deletion run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
21 changes: 10 additions & 11 deletions src/main/java/com/google/api/generator/gapic/composer/Composer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<GapicClass> composeServiceClasses(GapicContext context) {
List<GapicClass> 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<GapicClass> generateServiceClasses(
@Nonnull Service service, @Nonnull Map<String, Message> messageTypes) {
@Nonnull Service service,
@Nullable ServiceConfig serviceConfig,
@Nonnull Map<String, Message> messageTypes) {
List<GapicClass> 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.
Expand All @@ -60,10 +64,11 @@ public static List<GapicClass> generateResourceNameHelperClasses(
}

public static List<GapicClass> generateStubClasses(
Service service, Map<String, Message> messageTypes) {
Service service, ServiceConfig serviceConfig, Map<String, Message> messageTypes) {
List<GapicClass> 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;
Expand All @@ -86,12 +91,6 @@ public static List<GapicClass> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 = "{";
Expand All @@ -104,8 +106,8 @@ public static ServiceStubSettingsClassComposer instance() {
return INSTANCE;
}

@Override
public GapicClass generate(Service service, Map<String, Message> ignore) {
public GapicClass generate(
Service service, ServiceConfig serviceConfig, Map<String, Message> messageTypes) {
String pakkage = String.format("%s.stub", service.pakkage());
Map<String, TypeNode> types = createDynamicTypes(service, pakkage);
Map<String, VariableExpr> classMemberVarExprs = createClassMemberVarExprs(service, types);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -34,6 +36,9 @@ public abstract class GapicContext {

public abstract ImmutableSet<ResourceName> helperResourceNames();

@Nullable
public abstract ServiceConfig serviceConfig();

public static Builder builder() {
return new AutoValue_GapicContext.Builder();
}
Expand All @@ -48,6 +53,8 @@ public abstract static class Builder {

public abstract Builder setHelperResourceNames(Set<ResourceName> helperResourceNames);

public abstract Builder setServiceConfig(ServiceConfig serviceConfig);

public abstract GapicContext build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@ java_library(
"//:client_java_proto",
"//:longrunning_java_proto",
"//:resource_java_proto",
"//:service_config_java_proto",
"//src/main/java/com/google/api/generator/engine/ast",
"//src/main/java/com/google/api/generator/gapic/model",
"//src/main/java/com/google/api/generator/gapic/utils",
"@com_google_api_api_common//jar",
"@com_google_code_findbugs_jsr305//jar",
"@com_google_guava_guava//jar",
"@com_google_protobuf//:protobuf_java",
"@com_google_protobuf//:protobuf_java_util",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -69,9 +70,11 @@ public GapicParserException(String errorMessage) {
}

public static GapicContext parse(CodeGeneratorRequest request) {
// TODO(miraleung): Actually parse these files.
Optional<String> jsonConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request);
String jsonConfigPath = jsonConfigPathOpt.isPresent() ? jsonConfigPathOpt.get() : null;
Optional<String> serviceConfigPathOpt = PluginArgumentParser.parseJsonConfigPath(request);
String serviceConfigPath = serviceConfigPathOpt.isPresent() ? serviceConfigPathOpt.get() : null;
Optional<ServiceConfig> serviceConfigOpt = ServiceConfigParser.parseFile(serviceConfigPath);

// TODO(miraleung): Actually parse the yaml file.
Optional<String> gapicYamlConfigPathOpt =
PluginArgumentParser.parseGapicYamlConfigPath(request);
String gapicYamlConfigPath =
Expand All @@ -91,6 +94,7 @@ public static GapicContext parse(CodeGeneratorRequest request) {
.setMessages(messages)
.setResourceNames(resourceNames)
.setHelperResourceNames(outputArgResourceNames)
.setServiceConfig(serviceConfigOpt.isPresent() ? serviceConfigOpt.get() : null)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// 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.protoparser;

import com.google.common.base.Strings;
import com.google.protobuf.util.JsonFormat;
import io.grpc.serviceconfig.ServiceConfig;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Optional;

public class ServiceConfigParser {
public static Optional<ServiceConfig> parseFile(String serviceConfigFilePath) {
if (Strings.isNullOrEmpty(serviceConfigFilePath)) {
return Optional.empty();
}

ServiceConfig.Builder builder = ServiceConfig.newBuilder();
FileReader file = null;
try {
file = new FileReader(serviceConfigFilePath);
} catch (FileNotFoundException e) {
return Optional.empty();
}

try {
JsonFormat.parser().merge(file, builder);
} catch (IOException e) {
return Optional.empty();
}
return Optional.of(builder.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,33 @@
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;
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.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;

Expand All @@ -51,9 +60,16 @@ public void generateServiceClasses() {
List<Service> services =
Parser.parseService(echoFileDescriptor, messageTypes, resourceNames, outputResourceNames);

String jsonFilename = "showcase_grpc_service_config.json";
Path jsonPath = Paths.get(JSON_DIRECTORY, jsonFilename);
Optional<ServiceConfig> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ TESTS = [
"PluginArgumentParserTest",
"ResourceNameParserTest",
"ResourceReferenceParserTest",
"ServiceConfigParserTest",
]

filegroup(
Expand All @@ -16,8 +17,13 @@ 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.protoparser.{0}".format(test_name),
deps = [
"//:rpc_java_proto",
"//: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:status_java_proto",
Expand All @@ -27,6 +33,7 @@ filegroup(
"//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_protobuf//:protobuf_java",
"@com_google_protobuf//:protobuf_java_util",
"@com_google_truth_truth//jar",
"@junit_junit//jar",
],
Expand Down
Loading