Skip to content
This repository has been archived by the owner on Jun 28, 2022. It is now read-only.

Commit

Permalink
feat: REST GAPIC (REGAPIC) Support for Java (#3275)
Browse files Browse the repository at this point in the history
  • Loading branch information
vam-google committed Oct 12, 2020
1 parent ae9338a commit 782d11a
Show file tree
Hide file tree
Showing 32 changed files with 13,712 additions and 106 deletions.
3 changes: 3 additions & 0 deletions rules_gapic/gapic.bzl
Expand Up @@ -40,11 +40,13 @@ def _gapic_srcjar_impl(ctx):
_set_args(attr.service_yaml, "--service_yaml=", arguments, inputs)
_set_args(attr.package_yaml2, "--package_yaml2=", arguments, inputs)
_set_args(attr.grpc_service_config, "--grpc_service_config=", arguments, inputs)
_set_args(attr.transport, "--transport=", arguments)
else:
_set_args(attr.language, "--language=", arguments)
_set_args(attr.src, "--descriptor=", arguments, inputs)
_set_args(attr.package, "--package=", arguments)
_set_args(attr.grpc_service_config, "--grpc_service_config=", arguments, inputs)
_set_args(attr.transport, "--transport=", arguments)

gapic_generator = ctx.executable.gapic_generator
ctx.actions.run(
Expand Down Expand Up @@ -72,6 +74,7 @@ gapic_srcjar = rule(
"package": attr.string(mandatory = False),
"output_suffix": attr.string(mandatory = False, default = ".srcjar"),
"grpc_service_config": attr.label(mandatory = False, allow_single_file = True),
"transport": attr.string(mandatory = False),
"gapic_generator": attr.label(
default = Label("//:gapic_generator"),
executable = True,
Expand Down
36 changes: 28 additions & 8 deletions rules_gapic/java/java_gapic.bzl
Expand Up @@ -78,6 +78,7 @@ def java_gapic_srcjar(
package = None,
service_yaml = None,
grpc_service_config = None,
transport = None,
**kwargs):
raw_srcjar_name = "%s_raw" % name

Expand All @@ -90,6 +91,7 @@ def java_gapic_srcjar(
language = "java",
package = package,
grpc_service_config = grpc_service_config,
transport = transport,
**kwargs
)

Expand Down Expand Up @@ -132,6 +134,7 @@ def java_gapic_library(
package = None,
gen_resource_name = True,
grpc_service_config = None,
transport = None,
deps = [],
test_deps = [],
**kwargs):
Expand All @@ -144,6 +147,7 @@ def java_gapic_library(
artifact_type = "GAPIC_CODE",
package = package,
grpc_service_config = grpc_service_config,
transport = transport,
**kwargs
)

Expand All @@ -162,10 +166,7 @@ def java_gapic_library(
"@com_google_protobuf//:protobuf_java",
"@com_google_api_api_common//jar",
"@com_google_api_gax_java//gax:gax",
"@com_google_api_gax_java//gax-grpc:gax_grpc",
"@com_google_guava_guava//jar",
"@io_grpc_grpc_java//core:core",
"@io_grpc_grpc_java//protobuf:protobuf",
"@com_google_code_findbugs_jsr305//jar",
"@org_threeten_threetenbp//jar",
"@io_opencensus_opencensus_api//jar",
Expand All @@ -175,6 +176,17 @@ def java_gapic_library(
"@javax_annotation_javax_annotation_api//jar",
]

if transport == "rest":
actual_deps += [
"@com_google_api_gax_java//gax-httpjson:gax_httpjson",
]
else:
actual_deps += [
"@com_google_api_gax_java//gax-grpc:gax_grpc",
"@io_grpc_grpc_java//core:core",
"@io_grpc_grpc_java//protobuf:protobuf",
]

native.java_library(
name = name,
srcs = [":%s.srcjar" % srcjar_name],
Expand All @@ -183,16 +195,24 @@ def java_gapic_library(
)

actual_test_deps = test_deps + [
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
"@com_google_api_gax_java//gax:gax_testlib",
"@com_google_code_gson_gson//jar",
"@io_grpc_grpc_java//auth:auth",
"@io_grpc_grpc_netty_shaded//jar",
"@io_grpc_grpc_java//stub:stub",
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
"@junit_junit//jar",
]

if transport == "rest":
actual_test_deps += [
"@com_google_api_gax_java//gax-httpjson:gax_httpjson_testlib",
]
else:
actual_test_deps += [
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
"@io_grpc_grpc_java//auth:auth",
"@io_grpc_grpc_netty_shaded//jar",
"@io_grpc_grpc_java//stub:stub",
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
]

native.java_library(
name = "%s_test" % name,
srcs = [":%s-test.srcjar" % srcjar_name],
Expand Down
8 changes: 7 additions & 1 deletion rules_gapic/java/java_gapic_pkg.bzl
Expand Up @@ -160,6 +160,7 @@ def java_gapic_assembly_gradle_pkg(
name,
deps,
assembly_name = None,
transport = None,
**kwargs):
package_dir = name
if assembly_name:
Expand Down Expand Up @@ -206,9 +207,14 @@ def java_gapic_assembly_gradle_pkg(
grpc_target_dep = ["%s" % grpc_target]

if client_deps:
if transport == "rest":
template_label = Label("//rules_gapic/java:resources/gradle/client_disco.gradle.tmpl")
else:
template_label = Label("//rules_gapic/java:resources/gradle/client.gradle.tmpl")

_java_gapic_gradle_pkg(
name = client_target,
template_label = Label("//rules_gapic/java:resources/gradle/client.gradle.tmpl"),
template_label = template_label,
deps = proto_target_dep + client_deps,
test_deps = grpc_target_dep + client_test_deps,
**kwargs
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/google/api/codegen/GeneratorMain.java
Expand Up @@ -149,6 +149,17 @@ public class GeneratorMain {
.argName("GRPC-SERVICE-CONFIG")
.required(false)
.build();
private static final Option TRANSPORT =
Option.builder()
.longOpt("transport")
.desc(
"List of transports to support. Valid transport names ('grpc' or 'rest') are"
+ " separated by '+'. Default is 'grpc'. NOTE: for now, GAPICs support only"
+ " the first transport in the list.")
.hasArg()
.argName("TRANSPORT")
.required(false)
.build();

public static void printAvailableCommands() {
System.err.println(" Available artifact types:");
Expand Down Expand Up @@ -249,6 +260,7 @@ public static void gapicGeneratorMain(ArtifactType artifactType, String[] args)
options.addOption(OUTPUT_OPTION);
options.addOption(SAMPLE_YAML_NONREQUIRED_OPTION);
options.addOption(GRPC_SERVICE_CONFIG_OPTION);
options.addOption(TRANSPORT);
Option enabledArtifactsOption =
Option.builder()
.longOpt("enabled_artifacts")
Expand Down Expand Up @@ -299,6 +311,9 @@ public static void gapicGeneratorMain(ArtifactType artifactType, String[] args)

checkFile(toolOptions.get(ToolOptions.DESCRIPTOR_SET));

if (cl.getOptionValue(TRANSPORT.getLongOpt()) != null) {
toolOptions.set(GapicGeneratorApp.TRANSPORT, cl.getOptionValue(TRANSPORT.getLongOpt()));
}
if (cl.getOptionValues(SERVICE_YAML_NONREQUIRED_OPTION.getLongOpt()) != null) {
toolOptions.set(
ToolOptions.CONFIG_FILES,
Expand Down Expand Up @@ -346,6 +361,7 @@ public static ToolOptions createCodeGeneratorOptionsFromProtoc(String[] args)
options.addOption(DESCRIPTOR_SET_OPTION);
options.addOption(LANGUAGE_OPTION);
options.addOption(TARGET_API_PROTO_PACKAGE);
options.addOption(TRANSPORT);

CommandLine cl = (new DefaultParser()).parse(options, args);

Expand Down
Expand Up @@ -246,8 +246,7 @@ public List<MethodModel> getPublicMethods() {

@Override
public boolean isSupported(MethodModel method) {
boolean supported = true;
supported &=
boolean supported =
getFeatureConfig().enableGrpcStreaming() || !MethodConfig.isGrpcStreamingMethod(method);
supported &= getMethodConfig(method).getVisibility() != VisibilityConfig.DISABLED;
return supported;
Expand Down
Expand Up @@ -135,7 +135,7 @@ public GapicProductConfig withPackageName(String packageName) {
@Nullable
public static GapicProductConfig create(
Model model, ConfigProto configProto, TargetLanguage language) {
return create(model, configProto, null, null, null, language, null);
return create(model, configProto, null, null, null, language, null, TransportProtocol.GRPC);
}

/**
Expand All @@ -150,6 +150,8 @@ public static GapicProductConfig create(
* generate clients for.
* @param clientPackage The desired package name for the generated client.
* @param language The language that this config will be used to generate a client in.
* @param grpcServiceConfig Method retries configuration.
* @param transportProtocol Transport protocol to support.
*/
@Nullable
public static GapicProductConfig create(
Expand All @@ -159,7 +161,8 @@ public static GapicProductConfig create(
@Nullable String protoPackage,
@Nullable String clientPackage,
TargetLanguage language,
@Nullable ServiceConfig grpcServiceConfig) {
@Nullable ServiceConfig grpcServiceConfig,
TransportProtocol transportProtocol) {

final String defaultPackage;
SymbolTable symbolTable = model.getSymbolTable();
Expand Down Expand Up @@ -305,8 +308,6 @@ public static GapicProductConfig create(
return null;
}

TransportProtocol transportProtocol = TransportProtocol.GRPC;

String clientPackageName;
LanguageSettingsProto settings =
configProto.getLanguageSettingsMap().get(language.toString().toLowerCase());
Expand Down
Expand Up @@ -24,6 +24,7 @@
import com.google.api.codegen.config.GapicProductConfig;
import com.google.api.codegen.config.PackageMetadataConfig;
import com.google.api.codegen.config.PackagingConfig;
import com.google.api.codegen.config.TransportProtocol;
import com.google.api.codegen.grpc.ServiceConfig;
import com.google.api.codegen.samplegen.v1p2.SampleConfigProto;
import com.google.api.codegen.util.MultiYamlReader;
Expand Down Expand Up @@ -112,6 +113,14 @@ public class GapicGeneratorApp extends ToolDriverBase {
"The filepath of the JSON gRPC Service Config file.",
"");

public static final Option<String> TRANSPORT =
ToolOptions.createOption(
String.class,
"transport",
"List of transports to use ('rest' or 'grpc') separated by '+'. NOTE: For now"
+ " we only support the first transport in the list.",
"grpc");

private ArtifactType artifactType;

private final GapicWriter gapicWriter;
Expand Down Expand Up @@ -208,6 +217,16 @@ protected void process() throws Exception {
}

String clientPackage = Strings.emptyToNull(options.get(CLIENT_PACKAGE));
String transport = options.get(TRANSPORT).toLowerCase();

TransportProtocol tp;
if (transport.equals("grpc")) {
tp = TransportProtocol.GRPC;
} else if (transport.equals("rest")) {
tp = TransportProtocol.HTTP;
} else {
throw new IllegalArgumentException("Unknown transport protocol: " + transport);
}

GapicProductConfig productConfig =
GapicProductConfig.create(
Expand All @@ -217,7 +236,8 @@ protected void process() throws Exception {
protoPackage,
clientPackage,
language,
gRPCServiceConfig);
gRPCServiceConfig,
tp);
if (productConfig == null) {
ToolUtil.reportDiags(model.getDiagReporter().getDiagCollector(), true);
return;
Expand Down
Expand Up @@ -262,7 +262,7 @@ public static List<CodeGenerator<?>> create(
new JavaSurfaceTestTransformer<>(
javaTestPathMapper,
new JavaGapicSurfaceTransformer(javaTestPathMapper),
"java/grpc_test.snip")));
"java/test.snip")));
}
}
return generators;
Expand Down

0 comments on commit 782d11a

Please sign in to comment.