Skip to content

Commit fdcfe70

Browse files
authored
feat: REGAPIC initial implementation (#824)
This includes: 1) Proper GRPC transcoding 2) Mimimal REST Operations (go make it compilable) 3) Rely on resource names for tests values generation (to not fail http url path validation) 4) Empty Server Streaming method implementation
1 parent 7691f4e commit fdcfe70

Some content is hidden

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

44 files changed

+1767
-1678
lines changed

rules_java_gapic/resources/gradle/assembly.gradle.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ subprojects {
1212
apply plugin: 'java'
1313
apply plugin: 'maven'
1414

15-
sourceCompatibility = 1.7
16-
targetCompatibility = 1.7
15+
sourceCompatibility = 1.8
16+
targetCompatibility = 1.8
1717

1818
test {
1919
testLogging {

rules_java_gapic/resources/gradle/client_grpc.gradle.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ apply plugin: 'java'
99
description = 'GAPIC library for {{name}}'
1010
group = 'com.google.cloud'
1111
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
12-
sourceCompatibility = 1.7
13-
targetCompatibility = 1.7
12+
sourceCompatibility = 1.8
13+
targetCompatibility = 1.8
1414

1515
repositories {
1616
mavenCentral()

rules_java_gapic/resources/gradle/client_rest.gradle.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ apply plugin: 'java'
99
description = 'GAPIC library for {{name}}'
1010
group = 'com.google.cloud'
1111
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
12-
sourceCompatibility = 1.7
13-
targetCompatibility = 1.7
12+
sourceCompatibility = 1.8
13+
targetCompatibility = 1.8
1414

1515
repositories {
1616
mavenCentral()

rules_java_gapic/resources/gradle/grpc.gradle.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ apply plugin: 'java'
99
description = 'GRPC library for {{name}}'
1010
group = 'com.google.api.grpc'
1111
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
12-
sourceCompatibility = 1.7
13-
targetCompatibility = 1.7
12+
sourceCompatibility = 1.8
13+
targetCompatibility = 1.8
1414

1515
repositories {
1616
mavenCentral()

rules_java_gapic/resources/gradle/proto.gradle.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ apply plugin: 'java'
99
description = 'PROTO library for {{name}}'
1010
group = 'com.google.api.grpc'
1111
version = (findProperty('version') == 'unspecified') ? '0.0.0-SNAPSHOT' : version
12-
sourceCompatibility = 1.7
13-
targetCompatibility = 1.7
12+
sourceCompatibility = 1.8
13+
targetCompatibility = 1.8
1414

1515
repositories {
1616
mavenCentral()

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

+11-4
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
import com.google.api.generator.engine.ast.ClassDefinition;
1818
import com.google.api.generator.engine.ast.ScopeNode;
1919
import com.google.api.generator.gapic.composer.comment.CommentComposer;
20-
import com.google.api.generator.gapic.composer.common.ServiceClientClassComposer;
21-
import com.google.api.generator.gapic.composer.common.ServiceStubClassComposer;
2220
import com.google.api.generator.gapic.composer.grpc.GrpcServiceCallableFactoryClassComposer;
2321
import com.google.api.generator.gapic.composer.grpc.GrpcServiceStubClassComposer;
2422
import com.google.api.generator.gapic.composer.grpc.MockServiceClassComposer;
2523
import com.google.api.generator.gapic.composer.grpc.MockServiceImplClassComposer;
24+
import com.google.api.generator.gapic.composer.grpc.ServiceClientClassComposer;
2625
import com.google.api.generator.gapic.composer.grpc.ServiceClientTestClassComposer;
2726
import com.google.api.generator.gapic.composer.grpc.ServiceSettingsClassComposer;
27+
import com.google.api.generator.gapic.composer.grpc.ServiceStubClassComposer;
2828
import com.google.api.generator.gapic.composer.grpc.ServiceStubSettingsClassComposer;
2929
import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer;
3030
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer;
@@ -76,8 +76,10 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
7676
.services()
7777
.forEach(
7878
s -> {
79-
clazzes.add(ServiceStubClassComposer.instance().generate(context, s));
8079
if (context.transport() == Transport.REST) {
80+
clazzes.add(
81+
com.google.api.generator.gapic.composer.rest.ServiceStubClassComposer.instance()
82+
.generate(context, s));
8183
clazzes.add(
8284
com.google.api.generator.gapic.composer.rest.ServiceStubSettingsClassComposer
8385
.instance()
@@ -86,6 +88,7 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
8688
HttpJsonServiceCallableFactoryClassComposer.instance().generate(context, s));
8789
clazzes.add(HttpJsonServiceStubClassComposer.instance().generate(context, s));
8890
} else {
91+
clazzes.add(ServiceStubClassComposer.instance().generate(context, s));
8992
clazzes.add(ServiceStubSettingsClassComposer.instance().generate(context, s));
9093
clazzes.add(
9194
GrpcServiceCallableFactoryClassComposer.instance().generate(context, s));
@@ -101,13 +104,17 @@ public static List<GapicClass> generateClientSettingsClasses(GapicContext contex
101104
.services()
102105
.forEach(
103106
s -> {
104-
clazzes.add(ServiceClientClassComposer.instance().generate(context, s));
105107
if (context.transport() == Transport.REST) {
108+
clazzes.add(
109+
com.google.api.generator.gapic.composer.rest.ServiceClientClassComposer
110+
.instance()
111+
.generate(context, s));
106112
clazzes.add(
107113
com.google.api.generator.gapic.composer.rest.ServiceSettingsClassComposer
108114
.instance()
109115
.generate(context, s));
110116
} else {
117+
clazzes.add(ServiceClientClassComposer.instance().generate(context, s));
111118
clazzes.add(ServiceSettingsClassComposer.instance().generate(context, s));
112119
}
113120
});

src/main/java/com/google/api/generator/gapic/composer/common/ServiceClientClassComposer.java renamed to src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java

+32-17
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@
9696
import java.util.stream.Collectors;
9797
import javax.annotation.Generated;
9898

99-
public class ServiceClientClassComposer implements ClassComposer {
100-
private static final ServiceClientClassComposer INSTANCE = new ServiceClientClassComposer();
99+
public abstract class AbstractServiceClientClassComposer implements ClassComposer {
101100
private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse";
102101
private static final String CALLABLE_NAME_PATTERN = "%sCallable";
103102
private static final String PAGED_CALLABLE_NAME_PATTERN = "%sPagedCallable";
@@ -115,10 +114,14 @@ private enum CallableMethodKind {
115114
PAGED,
116115
}
117116

118-
private ServiceClientClassComposer() {}
117+
private final TransportContext transportContext;
119118

120-
public static ServiceClientClassComposer instance() {
121-
return INSTANCE;
119+
protected AbstractServiceClientClassComposer(TransportContext transportContext) {
120+
this.transportContext = transportContext;
121+
}
122+
123+
protected TransportContext getTransportContext() {
124+
return transportContext;
122125
}
123126

124127
@Override
@@ -198,7 +201,7 @@ private static List<CommentStatement> createClassHeaderComments(
198201
service, classMethodSampleCode, credentialsSampleCode, endpointSampleCode);
199202
}
200203

201-
private static List<MethodDefinition> createClassMethods(
204+
private List<MethodDefinition> createClassMethods(
202205
Service service,
203206
Map<String, Message> messageTypes,
204207
TypeStore typeStore,
@@ -225,14 +228,16 @@ private static boolean hasLroMethods(Service service) {
225228
return false;
226229
}
227230

228-
private static List<Statement> createFieldDeclarations(
231+
private List<Statement> createFieldDeclarations(
229232
Service service, TypeStore typeStore, boolean hasLroClient) {
230233
Map<String, TypeNode> fieldNameToTypes = new HashMap<>();
231234
fieldNameToTypes.put(
232235
"settings", typeStore.get(ClassNames.getServiceSettingsClassName(service)));
233236
fieldNameToTypes.put("stub", typeStore.get(ClassNames.getServiceStubClassName(service)));
234237
if (hasLroClient) {
235-
fieldNameToTypes.put("operationsClient", typeStore.get("OperationsClient"));
238+
fieldNameToTypes.put(
239+
getTransportContext().operationsClientName(),
240+
getTransportContext().operationsClientType());
236241
}
237242

238243
return fieldNameToTypes.entrySet().stream()
@@ -352,14 +357,14 @@ private static List<MethodDefinition> createStaticCreatorMethods(
352357
return methods;
353358
}
354359

355-
private static List<MethodDefinition> createConstructorMethods(
360+
private List<MethodDefinition> createConstructorMethods(
356361
Service service, TypeStore typeStore, boolean hasLroClient) {
357362
List<MethodDefinition> methods = new ArrayList<>();
358363
String thisClientName = ClassNames.getServiceClientClassName(service);
359364
String settingsName = ClassNames.getServiceSettingsClassName(service);
360365
TypeNode thisClassType = typeStore.get(thisClientName);
361366
TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service));
362-
TypeNode operationsClientType = typeStore.get("OperationsClient");
367+
TypeNode operationsClientType = getTransportContext().operationsClientType();
363368
TypeNode exceptionType = typeStore.get("IOException");
364369

365370
TypeNode settingsType = typeStore.get(settingsName);
@@ -374,7 +379,10 @@ private static List<MethodDefinition> createConstructorMethods(
374379
.build());
375380
VariableExpr operationsClientVarExpr =
376381
VariableExpr.withVariable(
377-
Variable.builder().setType(operationsClientType).setName("operationsClient").build());
382+
Variable.builder()
383+
.setType(operationsClientType)
384+
.setName(getTransportContext().operationsClientName())
385+
.build());
378386

379387
// Create the ServiceClient(ServiceSettings settings) ctor.
380388
List<Expr> ctorAssignmentExprs = new ArrayList<>();
@@ -404,10 +412,15 @@ private static List<MethodDefinition> createConstructorMethods(
404412
.build())
405413
.build());
406414

415+
String operationsStubGetterName =
416+
String.format(
417+
"get%s",
418+
JavaStyle.toUpperCamelCase(getTransportContext().transportOperationsStubName()));
419+
407420
Expr clientArgExpr =
408421
MethodInvocationExpr.builder()
409422
.setExprReferenceExpr(stubVarExpr.toBuilder().setExprReferenceExpr(thisExpr).build())
410-
.setMethodName("getOperationsStub")
423+
.setMethodName(operationsStubGetterName)
411424
.build();
412425
AssignmentExpr operationsClientAssignExpr =
413426
AssignmentExpr.builder()
@@ -476,15 +489,19 @@ private static List<MethodDefinition> createConstructorMethods(
476489
return methods;
477490
}
478491

479-
private static List<MethodDefinition> createGetterMethods(
492+
private List<MethodDefinition> createGetterMethods(
480493
Service service, TypeStore typeStore, boolean hasLroClient) {
481494
Map<String, TypeNode> methodNameToTypes = new LinkedHashMap<>();
482495
methodNameToTypes.put(
483496
"getSettings", typeStore.get(ClassNames.getServiceSettingsClassName(service)));
484497
methodNameToTypes.put("getStub", typeStore.get(ClassNames.getServiceStubClassName(service)));
485-
String getOperationsClientMethodName = "getOperationsClient";
498+
String getOperationsClientMethodName =
499+
String.format(
500+
"get%s",
501+
JavaStyle.toUpperCamelCase(getTransportContext().operationsClientName()));
486502
if (hasLroClient) {
487-
methodNameToTypes.put(getOperationsClientMethodName, typeStore.get("OperationsClient"));
503+
methodNameToTypes.put(
504+
getOperationsClientMethodName, getTransportContext().operationsClientType());
488505
}
489506
AnnotationNode betaStubAnnotation =
490507
AnnotationNode.builder()
@@ -1681,8 +1698,6 @@ private static void createVaporTypes(Service service, TypeStore typeStore) {
16811698
ClassNames.getServiceClientClassName(service));
16821699
}
16831700

1684-
// LRO Gapic-generated types.
1685-
typeStore.put("com.google.longrunning", "OperationsClient");
16861701
// Pagination types.
16871702
typeStore.putAll(
16881703
service.pakkage(),

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ private MethodDefinition createRpcTestMethod(
470470
VariableExpr.withVariable(
471471
Variable.builder().setType(methodArg.type()).setName(methodArgName).build());
472472
argExprs.add(varExpr);
473-
Expr valExpr = DefaultValueComposer.createDefaultValue(methodArg, resourceNames);
473+
Expr valExpr = createDefaultValue(methodArg, resourceNames);
474474
methodExprs.add(
475475
AssignmentExpr.builder()
476476
.setVariableExpr(varExpr.toBuilder().setIsDecl(true).build())
@@ -735,6 +735,9 @@ protected abstract List<Statement> createStreamingRpcExceptionTestStatements(
735735
Map<String, ResourceName> resourceNames,
736736
Map<String, Message> messageTypes);
737737

738+
protected abstract Expr createDefaultValue(
739+
MethodArgument methodArg, Map<String, ResourceName> resourceNames);
740+
738741
protected List<Statement> createRpcExceptionTestStatements(
739742
Method method,
740743
List<MethodArgument> methodSignature,
@@ -766,7 +769,7 @@ protected List<Statement> createRpcExceptionTestStatements(
766769
VariableExpr.withVariable(
767770
Variable.builder().setType(methodArg.type()).setName(methodArgName).build());
768771
argVarExprs.add(varExpr);
769-
Expr valExpr = DefaultValueComposer.createDefaultValue(methodArg, resourceNames);
772+
Expr valExpr = createDefaultValue(methodArg, resourceNames);
770773
tryBodyExprs.add(
771774
AssignmentExpr.builder()
772775
.setVariableExpr(varExpr.toBuilder().setIsDecl(true).build())

0 commit comments

Comments
 (0)