Skip to content

Commit

Permalink
[ggj][codegen] feat: pipe ServiceConfig into ServiceStubSettings (#203)
Browse files Browse the repository at this point in the history
* feat: parse grpc_service_config.json

* feat: pipe ServiceConfig into settings codegen
  • Loading branch information
miraleung committed Aug 22, 2020
1 parent 21221a0 commit 83fcb98
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 19 deletions.
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 @@ -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
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

0 comments on commit 83fcb98

Please sign in to comment.