Skip to content

Commit 81f6737

Browse files
authored
feat: DIREGAPIC initial implementation (#746)
ntegration tests (compute_small) are not present in this commit, as they depend on #743 and #744. Also, as a prerequisite, at least a basic implementation of DIREGAPIC must be merged in gapic-generator-java, to integrate it with [googleapis-discovery](https://github.com/googleapis/googleapis-discovery) first (since integration test infra depends on the actual googleapis/googleapis-discovery targets). Please check vam-google@8983e23 to see how it would look like with compute integration tests not excluded. `compliance.proto` is used as a basis for the REST composer tests. It was copied as is from [showcase/compliance.proto](https://github.com/googleapis/gapic-showcase/blob/master/schema/google/showcase/v1beta1/compliance.proto). Changes in `WORKSPACE` and `repositories.bzl` are necessary to make this repo work with gax-java `1.63.0` and above (`gax-java` vs `gapic-generator-java` java dependencies imports precedence). The other dependencies changes are either to bring deps in sync with the actual ones in googleapis, or to fix a specific import precedence issue. I also added (in a form of bazel rules) a proto descriptor dumper and a runner from the dumped file (for debugging purposes). Not technically required here (but was very helpful for debugging purposes, so hopefully we can preserve it).
1 parent 72fa76f commit 81f6737

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+4199
-128
lines changed

WORKSPACE

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
workspace(name = "gapic_generator_java")
22

33
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
4+
load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external")
45

56
# DO NOT REMOVE.
67
# This is needed to clobber any transitively-pulled in versions of bazel_skylib so that packages
@@ -14,6 +15,36 @@ http_archive(
1415
],
1516
)
1617

18+
jvm_maven_import_external(
19+
name = "google_java_format_all_deps",
20+
artifact = "com.google.googlejavaformat:google-java-format:jar:all-deps:1.7",
21+
server_urls = ["https://repo.maven.apache.org/maven2/", "http://repo1.maven.org/maven2/"],
22+
licenses = ["notice", "reciprocal"]
23+
)
24+
25+
# gax-java and its transitive dependencies must be imported before
26+
# gapic-generator-java dependencies to match the order in googleapis repository,
27+
# which in its turn, prioritizes actual generated clients runtime dependencies
28+
# over the generator dependencies.
29+
_gax_java_version = "1.64.0"
30+
31+
http_archive(
32+
name = "com_google_api_gax_java",
33+
strip_prefix = "gax-java-%s" % _gax_java_version,
34+
urls = ["https://github.com/googleapis/gax-java/archive/v%s.zip" % _gax_java_version],
35+
)
36+
37+
load("@com_google_api_gax_java//:repository_rules.bzl", "com_google_api_gax_java_properties")
38+
39+
com_google_api_gax_java_properties(
40+
name = "com_google_api_gax_java_properties",
41+
file = "@com_google_api_gax_java//:dependencies.properties",
42+
)
43+
44+
load("@com_google_api_gax_java//:repositories.bzl", "com_google_api_gax_java_repositories")
45+
46+
com_google_api_gax_java_repositories()
47+
1748
load("//:repository_rules.bzl", "gapic_generator_java_properties")
1849

1950
gapic_generator_java_properties(
@@ -35,8 +66,8 @@ protobuf_deps()
3566
# Import the monolith so we can transitively use its gapic rules for googleapis.
3667
http_archive(
3768
name = "com_google_api_codegen",
38-
strip_prefix = "gapic-generator-2.4.6",
39-
urls = ["https://github.com/googleapis/gapic-generator/archive/v2.4.6.zip"],
69+
strip_prefix = "gapic-generator-2.11.1",
70+
urls = ["https://github.com/googleapis/gapic-generator/archive/v2.11.1.zip"],
4071
)
4172

4273
load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language")
@@ -48,25 +79,12 @@ switched_rules_by_language(
4879
java = True,
4980
)
5081

51-
_gax_java_version = PROPERTIES["version.com_google_gax_java"]
52-
53-
http_archive(
54-
name = "com_google_api_gax_java",
55-
strip_prefix = "gax-java-%s" % _gax_java_version,
56-
urls = ["https://github.com/googleapis/gax-java/archive/v%s.zip" % _gax_java_version],
57-
)
58-
59-
load("@com_google_api_gax_java//:repository_rules.bzl", "com_google_api_gax_java_properties")
60-
61-
com_google_api_gax_java_properties(
62-
name = "com_google_api_gax_java_properties",
63-
file = "@com_google_api_gax_java//:dependencies.properties",
64-
)
65-
66-
load("@com_google_api_gax_java//:repositories.bzl", "com_google_api_gax_java_repositories")
67-
68-
com_google_api_gax_java_repositories()
69-
7082
load("@io_grpc_grpc_java//:repositories.bzl", "grpc_java_repositories")
7183

7284
grpc_java_repositories()
85+
86+
http_archive(
87+
name = "com_google_disco_to_proto3_converter",
88+
strip_prefix = "disco-to-proto3-converter-1839f6aca5e968e59b7acc03e7018b0fda8c480b",
89+
urls = ["https://github.com/googleapis/disco-to-proto3-converter/archive/1839f6aca5e968e59b7acc03e7018b0fda8c480b.zip"],
90+
)

dependencies.properties

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
# Target workspace name: com_google_api_codegen
88

99
# Versions only, for dependencies which actual artifacts differ between Bazel and Gradle
10-
version.com_google_protobuf=3.13.0
10+
version.com_google_protobuf=3.15.2
1111
# Version of google-java-format is downgraded from 1.8 to 1.7, because 1.8 supports java 11 minimum, while our JRE is java 8.
1212
version.google_java_format=1.7
1313
version.com_google_api_common_java=1.9.3
14-
version.com_google_gax_java=1.62.0
1514
version.io_grpc_java=1.30.2
1615

1716
# Common deps.
@@ -20,7 +19,7 @@ maven.com_google_code_findbugs_jsr305=com.google.code.findbugs:jsr305:3.0.0
2019
maven.com_google_auto_value_auto_value=com.google.auto.value:auto-value:1.7.2
2120
maven.com_google_auto_value_auto_value_annotations=com.google.auto.value:auto-value-annotations:1.7.2
2221
maven.com_google_code_gson=com.google.code.gson:gson:2.8.6
23-
maven.com_google_protobuf_protobuf_java=com.google.protobuf:protobuf-java:3.12.2
22+
maven.com_google_protobuf_protobuf_java=com.google.protobuf:protobuf-java:3.15.8
2423
maven.io_github_java_diff_utils=io.github.java-diff-utils:java-diff-utils:4.0
2524
maven.javax_annotation_javax_annotation_api=javax.annotation:javax.annotation-api:1.3.2
2625
maven.javax_validation_javax_validation_api=javax.validation:validation-api:2.0.1.Final

rules_java_gapic/java_gapic.bzl

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,17 @@ def java_gapic_library(
127127
service_yaml = None,
128128
deps = [],
129129
test_deps = [],
130+
# possible values are: "grpc", "rest", "grpc+rest"
131+
transport = None,
132+
# Can be used to provide a java_library with a customized generator,
133+
# like the one which dumps descriptor to a file for future debugging.
134+
_java_generator_name = "java_gapic",
130135
**kwargs):
131136
file_args_dict = {}
132137

133138
if grpc_service_config:
134139
file_args_dict[grpc_service_config] = "grpc-service-config"
135-
else:
140+
elif transport != "rest":
136141
for keyword in NO_GRPC_CONFIG_ALLOWLIST:
137142
if keyword not in name:
138143
fail("Missing a gRPC service config file")
@@ -157,12 +162,15 @@ def java_gapic_library(
157162
srcjar_name = name + "_srcjar"
158163
raw_srcjar_name = srcjar_name + "_raw"
159164
output_suffix = ".srcjar"
165+
opt_args = []
166+
167+
if transport:
168+
opt_args.append("transport=%s" % transport)
160169

161170
# Produces the GAPIC metadata file if this flag is set. to any value.
162171
# Protoc invocation: --java_gapic_opt=metadata
163172
plugin_args = ["metadata"]
164173

165-
_java_generator_name = "java_gapic"
166174
proto_custom_library(
167175
name = raw_srcjar_name,
168176
deps = srcs,
@@ -172,6 +180,7 @@ def java_gapic_library(
172180
opt_file_args = file_args_dict,
173181
output_type = _java_generator_name,
174182
output_suffix = output_suffix,
183+
opt_args = opt_args,
175184
**kwargs
176185
)
177186

@@ -201,10 +210,7 @@ def java_gapic_library(
201210
"@com_google_protobuf//:protobuf_java",
202211
"@com_google_api_api_common//jar",
203212
"@com_google_api_gax_java//gax:gax",
204-
"@com_google_api_gax_java//gax-grpc:gax_grpc",
205213
"@com_google_guava_guava//jar",
206-
"@io_grpc_grpc_java//core:core",
207-
"@io_grpc_grpc_java//protobuf:protobuf",
208214
"@com_google_code_findbugs_jsr305//jar",
209215
"@org_threeten_threetenbp//jar",
210216
"@io_opencensus_opencensus_api//jar",
@@ -214,6 +220,17 @@ def java_gapic_library(
214220
"@javax_annotation_javax_annotation_api//jar",
215221
]
216222

223+
if transport == "rest":
224+
actual_deps += [
225+
"@com_google_api_gax_java//gax-httpjson:gax_httpjson",
226+
]
227+
else:
228+
actual_deps += [
229+
"@com_google_api_gax_java//gax-grpc:gax_grpc",
230+
"@io_grpc_grpc_java//core:core",
231+
"@io_grpc_grpc_java//protobuf:protobuf",
232+
]
233+
217234
native.java_library(
218235
name = name,
219236
srcs = ["%s.srcjar" % srcjar_name],
@@ -224,15 +241,24 @@ def java_gapic_library(
224241
# Test deps.
225242
actual_test_deps = [
226243
"@com_google_googleapis//google/type:type_java_proto", # Commonly used.
227-
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
228244
"@com_google_api_gax_java//gax:gax_testlib",
229245
"@com_google_code_gson_gson//jar",
230-
"@io_grpc_grpc_java//auth:auth",
231-
"@io_grpc_grpc_netty_shaded//jar",
232-
"@io_grpc_grpc_java//stub:stub",
233-
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
234246
"@junit_junit//jar",
235247
]
248+
249+
if transport == "rest":
250+
actual_test_deps += [
251+
"@com_google_api_gax_java//gax-httpjson:gax_httpjson_testlib",
252+
]
253+
else:
254+
actual_test_deps += [
255+
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
256+
"@io_grpc_grpc_java//auth:auth",
257+
"@io_grpc_grpc_netty_shaded//jar",
258+
"@io_grpc_grpc_java//stub:stub",
259+
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
260+
]
261+
236262
_append_dep_without_duplicates(actual_test_deps, test_deps)
237263
_append_dep_without_duplicates(actual_test_deps, actual_deps)
238264

rules_java_gapic/java_gapic_pkg.bzl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ def java_gapic_assembly_gradle_pkg(
301301
name,
302302
deps,
303303
assembly_name = None,
304+
transport = None,
304305
**kwargs):
305306
package_dir = name
306307
if assembly_name:
@@ -350,9 +351,14 @@ def java_gapic_assembly_gradle_pkg(
350351
grpc_target_dep = ["%s" % grpc_target]
351352

352353
if client_deps:
354+
if transport == "rest":
355+
template_label = Label("//rules_java_gapic:resources/gradle/client_rest.gradle.tmpl")
356+
else:
357+
template_label = Label("//rules_java_gapic:resources/gradle/client_grpc.gradle.tmpl")
358+
353359
_java_gapic_gradle_pkg(
354360
name = client_target,
355-
template_label = Label("//rules_java_gapic:resources/gradle/client.gradle.tmpl"),
361+
template_label = template_label,
356362
deps = proto_target_dep + client_deps,
357363
test_deps = grpc_target_dep + client_test_deps,
358364
**kwargs
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
buildscript {
2+
repositories {
3+
mavenCentral()
4+
}
5+
}
6+
7+
apply plugin: 'java'
8+
9+
description = 'GAPIC library for {{name}}'
10+
group = 'com.google.cloud'
11+
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
12+
sourceCompatibility = 1.7
13+
targetCompatibility = 1.7
14+
15+
repositories {
16+
mavenCentral()
17+
mavenLocal()
18+
}
19+
20+
compileJava.options.encoding = 'UTF-8'
21+
javadoc.options.encoding = 'UTF-8'
22+
23+
dependencies {
24+
compile 'com.google.api:gax:{{version.gax}}'
25+
testCompile 'com.google.api:gax:{{version.gax}}:testlib'
26+
compile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}'
27+
testCompile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}:testlib'
28+
testCompile '{{maven.junit_junit}}'
29+
{{extra_deps}}
30+
}
31+
32+
task smokeTest(type: Test) {
33+
filter {
34+
includeTestsMatching "*SmokeTest"
35+
setFailOnNoMatchingTests false
36+
}
37+
}
38+
39+
test {
40+
exclude "**/*SmokeTest*"
41+
}
42+
43+
sourceSets {
44+
main {
45+
java {
46+
srcDir 'src/main/java'
47+
}
48+
}
49+
}
50+
51+
clean {
52+
delete 'all-jars'
53+
}
54+
55+
task allJars(type: Copy) {
56+
dependsOn test, jar
57+
into 'all-jars'
58+
// Replace with `from configurations.testRuntime, jar` to include test dependencies
59+
from configurations.runtime, jar
60+
}

src/main/java/com/google/api/generator/gapic/composer/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ java_library(
2121
"//src/main/java/com/google/api/generator/gapic/composer/common",
2222
"//src/main/java/com/google/api/generator/gapic/composer/defaultvalue",
2323
"//src/main/java/com/google/api/generator/gapic/composer/grpc",
24+
"//src/main/java/com/google/api/generator/gapic/composer/rest",
2425
"//src/main/java/com/google/api/generator/gapic/composer/resourcename",
2526
"//src/main/java/com/google/api/generator/gapic/composer/samplecode",
2627
"//src/main/java/com/google/api/generator/gapic/composer/store",

src/main/java/com/google/api/generator/gapic/composer/Composer.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@
2727
import com.google.api.generator.gapic.composer.grpc.ServiceSettingsClassComposer;
2828
import com.google.api.generator.gapic.composer.grpc.ServiceStubSettingsClassComposer;
2929
import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer;
30+
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer;
31+
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceStubClassComposer;
3032
import com.google.api.generator.gapic.model.GapicClass;
3133
import com.google.api.generator.gapic.model.GapicClass.Kind;
3234
import com.google.api.generator.gapic.model.GapicContext;
3335
import com.google.api.generator.gapic.model.GapicPackageInfo;
3436
import com.google.api.generator.gapic.model.ResourceName;
3537
import com.google.api.generator.gapic.model.Service;
38+
import com.google.api.generator.gapic.model.Transport;
3639
import com.google.common.annotations.VisibleForTesting;
3740
import java.util.ArrayList;
3841
import java.util.List;
@@ -80,9 +83,20 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
8083
.forEach(
8184
s -> {
8285
clazzes.add(ServiceStubClassComposer.instance().generate(context, s));
83-
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
84-
clazzes.add(GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
85-
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
86+
if (context.transport() == Transport.REST) {
87+
clazzes.add(
88+
com.google.api.generator.gapic.composer.rest.ServiceStubSettingsClassComposer
89+
.instance()
90+
.generate(context, s));
91+
clazzes.add(
92+
HttpJsonServiceCallableFactoryClassComposer.instance().generate(context, s));
93+
clazzes.add(HttpJsonServiceStubClassComposer.instance().generate(context, s));
94+
} else {
95+
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
96+
clazzes.add(
97+
GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
98+
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
99+
}
86100
});
87101
return clazzes;
88102
}
@@ -94,7 +108,14 @@ public static List<GapicClass> generateClientSettingsClasses(GapicContext contex
94108
.forEach(
95109
s -> {
96110
clazzes.add(ServiceClientClassComposer.instance().generate(context, s));
97-
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
111+
if (context.transport() == Transport.REST) {
112+
clazzes.add(
113+
com.google.api.generator.gapic.composer.rest.ServiceSettingsClassComposer
114+
.instance()
115+
.generate(context, s));
116+
} else {
117+
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
118+
}
98119
});
99120
return clazzes;
100121
}
@@ -103,15 +124,28 @@ public static List<GapicClass> generateMockClasses(GapicContext context, List<Se
103124
List<GapicClass> clazzes = new ArrayList<>();
104125
services.forEach(
105126
s -> {
106-
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
107-
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
127+
if (context.transport() == Transport.REST) {
128+
// REST transport tests donot not use mock services.
129+
} else {
130+
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
131+
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
132+
}
108133
});
109134
return clazzes;
110135
}
111136

112137
public static List<GapicClass> generateTestClasses(GapicContext context) {
113138
return context.services().stream()
114-
.map(s -> ServiceClientTestClassComposer.instance().generate(context, s))
139+
.map(
140+
s -> {
141+
if (context.transport() == Transport.REST) {
142+
return com.google.api.generator.gapic.composer.rest.ServiceClientTestClassComposer
143+
.instance()
144+
.generate(context, s);
145+
} else {
146+
return ServiceClientTestClassComposer.instance().generate(context, s);
147+
}
148+
})
115149
.collect(Collectors.toList());
116150
}
117151

0 commit comments

Comments
 (0)