Skip to content

Commit 4242f8d

Browse files
committed
feat: REGAPIC Multitransport implementation (grpc+rest)
1) Fully backward compatible with grpc-only GAPIC 2) Strictly speaking not fully backward compatible with rest-only REGAPIC (but is compatible for practical cases). See below for details. 3) Introduces the concept of default transport (is necessary to preserve backward-compabitility). The default behavior assumes grpc transport.
1 parent fdcfe70 commit 4242f8d

32 files changed

Lines changed: 1308 additions & 464 deletions

rules_java_gapic/java_gapic.bzl

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def _java_gapic_srcjar(
135135

136136
if grpc_service_config:
137137
file_args_dict[grpc_service_config] = "grpc-service-config"
138-
elif transport != "rest":
138+
elif not transport or transport == "grpc":
139139
for keyword in NO_GRPC_CONFIG_ALLOWLIST:
140140
if keyword not in name:
141141
fail("Missing a gRPC service config file")
@@ -230,16 +230,25 @@ def java_gapic_library(
230230
"@javax_annotation_javax_annotation_api//jar",
231231
]
232232

233-
if transport == "rest":
233+
if not transport or transport == "grpc":
234+
actual_deps += [
235+
"@com_google_api_gax_java//gax-grpc:gax_grpc",
236+
"@io_grpc_grpc_java//core:core",
237+
"@io_grpc_grpc_java//protobuf:protobuf",
238+
]
239+
elif transport == "rest":
234240
actual_deps += [
235241
"@com_google_api_gax_java//gax-httpjson:gax_httpjson",
236242
]
237-
else:
243+
elif transport == "grpc+rest":
238244
actual_deps += [
239245
"@com_google_api_gax_java//gax-grpc:gax_grpc",
240246
"@io_grpc_grpc_java//core:core",
241247
"@io_grpc_grpc_java//protobuf:protobuf",
248+
"@com_google_api_gax_java//gax-httpjson:gax_httpjson",
242249
]
250+
else:
251+
fail("Unknown transport: %s" % transport)
243252

244253
native.java_library(
245254
name = name,
@@ -256,18 +265,29 @@ def java_gapic_library(
256265
"@junit_junit//jar",
257266
]
258267

259-
if transport == "rest":
268+
if not transport or transport == "grpc":
269+
actual_test_deps += [
270+
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
271+
"@io_grpc_grpc_java//auth:auth",
272+
"@io_grpc_grpc_netty_shaded//jar",
273+
"@io_grpc_grpc_java//stub:stub",
274+
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
275+
]
276+
elif transport == "rest":
260277
actual_test_deps += [
261278
"@com_google_api_gax_java//gax-httpjson:gax_httpjson_testlib",
262279
]
263-
else:
280+
elif transport == "grpc+rest":
264281
actual_test_deps += [
265282
"@com_google_api_gax_java//gax-grpc:gax_grpc_testlib",
266283
"@io_grpc_grpc_java//auth:auth",
267284
"@io_grpc_grpc_netty_shaded//jar",
268285
"@io_grpc_grpc_java//stub:stub",
269286
"@io_opencensus_opencensus_contrib_grpc_metrics//jar",
287+
"@com_google_api_gax_java//gax-httpjson:gax_httpjson_testlib",
270288
]
289+
else:
290+
fail("Unknown transport: %s" % transport)
271291

272292
_append_dep_without_duplicates(actual_test_deps, test_deps)
273293
_append_dep_without_duplicates(actual_test_deps, actual_deps)

rules_java_gapic/java_gapic_pkg.bzl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,12 @@ def java_gapic_assembly_gradle_pkg(
351351
grpc_target_dep = ["%s" % grpc_target]
352352

353353
if client_deps:
354-
if transport == "rest":
355-
template_label = Label("//rules_java_gapic:resources/gradle/client_rest.gradle.tmpl")
356-
else:
354+
if not transport or transport == "rest":
357355
template_label = Label("//rules_java_gapic:resources/gradle/client_grpc.gradle.tmpl")
356+
elif transport == "rest":
357+
template_label = Label("//rules_java_gapic:resources/gradle/client_rest.gradle.tmpl")
358+
elif transport == "grpc+rest":
359+
template_label = Label("//rules_java_gapic:resources/gradle/client_grpcrest.gradle.tmpl")
358360

359361
_java_gapic_gradle_pkg(
360362
name = client_target,
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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.8
13+
targetCompatibility = 1.8
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-grpc:{{version.gax_grpc}}'
27+
testCompile 'com.google.api:gax-grpc:{{version.gax_grpc}}:testlib'
28+
compile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}'
29+
testCompile 'com.google.api:gax-httpjson:{{version.gax_httpjson}}:testlib'
30+
testCompile 'io.grpc:grpc-netty-shaded:{{version.io_grpc}}'
31+
testCompile '{{maven.junit_junit}}'
32+
{{extra_deps}}
33+
}
34+
35+
task smokeTest(type: Test) {
36+
filter {
37+
includeTestsMatching "*SmokeTest"
38+
setFailOnNoMatchingTests false
39+
}
40+
}
41+
42+
test {
43+
exclude "**/*SmokeTest*"
44+
}
45+
46+
sourceSets {
47+
main {
48+
java {
49+
srcDir 'src/main/java'
50+
}
51+
}
52+
}
53+
54+
clean {
55+
delete 'all-jars'
56+
}
57+
58+
task allJars(type: Copy) {
59+
dependsOn test, jar
60+
into 'all-jars'
61+
// Replace with `from configurations.testRuntime, jar` to include test dependencies
62+
from configurations.runtime, jar
63+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ filegroup(
99
"//src/main/java/com/google/api/generator/gapic/composer/comment:comment_files",
1010
"//src/main/java/com/google/api/generator/gapic/composer/defaultvalue:defaultvalue_files",
1111
"//src/main/java/com/google/api/generator/gapic/composer/grpc:grpc_files",
12+
"//src/main/java/com/google/api/generator/gapic/composer/grpcrest:grpcrest_files",
1213
"//src/main/java/com/google/api/generator/gapic/composer/resourcename:resourcename_files",
1314
"//src/main/java/com/google/api/generator/gapic/composer/rest:rest_files",
1415
"//src/main/java/com/google/api/generator/gapic/composer/samplecode:samplecode_files",

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/grpcrest",
2425
"//src/main/java/com/google/api/generator/gapic/composer/resourcename",
2526
"//src/main/java/com/google/api/generator/gapic/composer/rest",
2627
"//src/main/java/com/google/api/generator/gapic/composer/samplecode",

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

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package com.google.api.generator.gapic.composer;
1616

1717
import com.google.api.generator.engine.ast.ClassDefinition;
18-
import com.google.api.generator.engine.ast.ScopeNode;
1918
import com.google.api.generator.gapic.composer.comment.CommentComposer;
2019
import com.google.api.generator.gapic.composer.grpc.GrpcServiceCallableFactoryClassComposer;
2120
import com.google.api.generator.gapic.composer.grpc.GrpcServiceStubClassComposer;
@@ -26,11 +25,11 @@
2625
import com.google.api.generator.gapic.composer.grpc.ServiceSettingsClassComposer;
2726
import com.google.api.generator.gapic.composer.grpc.ServiceStubClassComposer;
2827
import com.google.api.generator.gapic.composer.grpc.ServiceStubSettingsClassComposer;
28+
import com.google.api.generator.gapic.composer.grpcrest.HttpJsonServiceClientTestClassComposer;
2929
import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer;
3030
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer;
3131
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceStubClassComposer;
3232
import com.google.api.generator.gapic.model.GapicClass;
33-
import com.google.api.generator.gapic.model.GapicClass.Kind;
3433
import com.google.api.generator.gapic.model.GapicContext;
3534
import com.google.api.generator.gapic.model.GapicPackageInfo;
3635
import com.google.api.generator.gapic.model.Service;
@@ -87,12 +86,30 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
8786
clazzes.add(
8887
HttpJsonServiceCallableFactoryClassComposer.instance().generate(context, s));
8988
clazzes.add(HttpJsonServiceStubClassComposer.instance().generate(context, s));
90-
} else {
89+
} else if (context.transport() == Transport.GRPC) {
9190
clazzes.add(ServiceStubClassComposer.instance().generate(context, s));
9291
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
9392
clazzes.add(
9493
GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
9594
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
95+
} else if (context.transport() == Transport.GRPC_REST) {
96+
clazzes.add(
97+
com.google.api.generator.gapic.composer.grpcrest.ServiceStubClassComposer
98+
.instance()
99+
.generate(context, s));
100+
clazzes.add(
101+
com.google.api.generator.gapic.composer.grpcrest
102+
.ServiceStubSettingsClassComposer.instance()
103+
.generate(context, s));
104+
clazzes.add(
105+
GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
106+
clazzes.add(GrpcServiceStubClassComposer.instance().generate(context, s));
107+
clazzes.add(
108+
HttpJsonServiceCallableFactoryClassComposer.instance().generate(context, s));
109+
clazzes.add(
110+
com.google.api.generator.gapic.composer.grpcrest
111+
.HttpJsonServiceStubClassComposer.instance()
112+
.generate(context, s));
96113
}
97114
});
98115
return clazzes;
@@ -113,9 +130,18 @@ public static List<GapicClass> generateClientSettingsClasses(GapicContext contex
113130
com.google.api.generator.gapic.composer.rest.ServiceSettingsClassComposer
114131
.instance()
115132
.generate(context, s));
116-
} else {
133+
} else if (context.transport() == Transport.GRPC) {
117134
clazzes.add(ServiceClientClassComposer.instance().generate(context, s));
118135
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
136+
} else if (context.transport() == Transport.GRPC_REST) {
137+
clazzes.add(
138+
com.google.api.generator.gapic.composer.grpcrest.ServiceClientClassComposer
139+
.instance()
140+
.generate(context, s));
141+
clazzes.add(
142+
com.google.api.generator.gapic.composer.grpcrest.ServiceSettingsClassComposer
143+
.instance()
144+
.generate(context, s));
119145
}
120146
});
121147
return clazzes;
@@ -127,7 +153,10 @@ public static List<GapicClass> generateMockClasses(GapicContext context, List<Se
127153
s -> {
128154
if (context.transport() == Transport.REST) {
129155
// REST transport tests donot not use mock services.
130-
} else {
156+
} else if (context.transport() == Transport.GRPC) {
157+
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
158+
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
159+
} else if (context.transport() == Transport.GRPC_REST) {
131160
clazzes.add(MockServiceClassComposer.instance().generate(context, s));
132161
clazzes.add(MockServiceImplClassComposer.instance().generate(context, s));
133162
}
@@ -136,35 +165,25 @@ public static List<GapicClass> generateMockClasses(GapicContext context, List<Se
136165
}
137166

138167
public static List<GapicClass> generateTestClasses(GapicContext context) {
139-
return context.services().stream()
140-
.map(
168+
List<GapicClass> clazzes = new ArrayList<>();
169+
context
170+
.services()
171+
.forEach(
141172
s -> {
142173
if (context.transport() == Transport.REST) {
143-
return com.google.api.generator.gapic.composer.rest.ServiceClientTestClassComposer
144-
.instance()
145-
.generate(context, s);
146-
} else {
147-
return ServiceClientTestClassComposer.instance().generate(context, s);
174+
clazzes.add(
175+
com.google.api.generator.gapic.composer.rest.ServiceClientTestClassComposer
176+
.instance()
177+
.generate(context, s));
178+
} else if (context.transport() == Transport.GRPC) {
179+
clazzes.add(ServiceClientTestClassComposer.instance().generate(context, s));
180+
} else if (context.transport() == Transport.GRPC_REST) {
181+
clazzes.add(ServiceClientTestClassComposer.instance().generate(context, s));
182+
clazzes.add(HttpJsonServiceClientTestClassComposer.instance().generate(context, s));
148183
}
149-
})
150-
.collect(Collectors.toList());
151-
}
152-
153-
/** ====================== HELPERS ==================== */
154-
// TODO(miraleung): Add method list.
155-
private static GapicClass generateGenericClass(Kind kind, String name, Service service) {
156-
String pakkage = service.pakkage();
157-
if (kind.equals(Kind.STUB)) {
158-
pakkage += ".stub";
159-
}
184+
});
160185

161-
ClassDefinition classDef =
162-
ClassDefinition.builder()
163-
.setPackageString(pakkage)
164-
.setName(name)
165-
.setScope(ScopeNode.PUBLIC)
166-
.build();
167-
return GapicClass.create(kind, classDef);
186+
return clazzes;
168187
}
169188

170189
@VisibleForTesting

src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ protected MethodDefinition createGenericCallableMethod(
257257
.setVariable(
258258
Variable.builder()
259259
.setName("operationsStub")
260-
.setType(getTransportContext().operationsStubType())
260+
.setType(getTransportContext().operationsStubTypes().get(0))
261261
.build())
262262
.setIsDecl(true)
263263
.build());

0 commit comments

Comments
 (0)