Skip to content

Commit d7b29e0

Browse files
Feat: Implement DIREGAPIC LRO annotations (#832)
* fix ServiceStub Goldens * fix Stub golden * fix Stub golden * fix CallableFactory golden * fix java format * add annotation placement comments * only add machinery to methods that return operation * add grpc file that contained method that was edited on abstract class * update HttpJsonComplianceStub.golden * java format * add initial methods from annotations * add initial methods from annotations * Implement annotations * java format * fix package for Status * fix CallableFactory generics * java format * initialize new fields in message for parser test * set default value for operation_polling_method * add brackets to if statement * remove comments and invoke methods * add brackets to if statements and remove invoke methods * java formet
1 parent 00d94ed commit d7b29e0

16 files changed

Lines changed: 532 additions & 163 deletions

WORKSPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ jvm_maven_import_external(
3232
# gapic-generator-java dependencies to match the order in googleapis repository,
3333
# which in its turn, prioritizes actual generated clients runtime dependencies
3434
# over the generator dependencies.
35+
3536
_gax_java_version = "2.3.0"
3637

3738
http_archive(

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.google.api.generator.gapic.model.GapicClass;
4242
import com.google.api.generator.gapic.model.GapicClass.Kind;
4343
import com.google.api.generator.gapic.model.GapicContext;
44+
import com.google.api.generator.gapic.model.Method;
4445
import com.google.api.generator.gapic.model.Service;
4546
import java.util.ArrayList;
4647
import java.util.Arrays;
@@ -68,6 +69,13 @@ public GapicClass generate(GapicContext context, Service service) {
6869
GapicClass.Kind kind = Kind.STUB;
6970
String pakkage = String.format("%s.stub", service.pakkage());
7071

72+
String operationService = "";
73+
for(Method method : service.methods()) {
74+
if(method.operationService() != null) {
75+
operationService = method.operationService();
76+
}
77+
}
78+
7179
StubCommentComposer commentComposer =
7280
new StubCommentComposer(getTransportContext().transportName());
7381
ClassDefinition classDef =
@@ -79,7 +87,7 @@ public GapicClass generate(GapicContext context, Service service) {
7987
.setAnnotations(createClassAnnotations(service, typeStore))
8088
.setImplementsTypes(createClassImplements(typeStore))
8189
.setName(className)
82-
.setMethods(createClassMethods(typeStore))
90+
.setMethods(createClassMethods(typeStore, operationService))
8391
.setScope(ScopeNode.PUBLIC)
8492
.build();
8593
return GapicClass.create(kind, classDef);
@@ -112,12 +120,12 @@ protected List<AnnotationNode> createClassAnnotations(Service service, TypeStore
112120
*/
113121
protected abstract List<TypeNode> createClassImplements(TypeStore typeStore);
114122

115-
protected List<MethodDefinition> createClassMethods(TypeStore typeStore) {
123+
protected List<MethodDefinition> createClassMethods(TypeStore typeStore, String operationService) {
116124
return Arrays.asList(
117125
createUnaryCallableMethod(typeStore),
118126
createPagedCallableMethod(typeStore),
119127
createBatchingCallableMethod(typeStore),
120-
createOperationCallableMethod(typeStore));
128+
createOperationCallableMethod(typeStore, operationService));
121129
}
122130

123131
protected MethodDefinition createUnaryCallableMethod(TypeStore typeStore) {
@@ -182,7 +190,7 @@ protected MethodDefinition createBatchingCallableMethod(TypeStore typeStore) {
182190
.collect(Collectors.toList()));
183191
}
184192

185-
protected abstract MethodDefinition createOperationCallableMethod(TypeStore typeStore);
193+
protected abstract MethodDefinition createOperationCallableMethod(TypeStore typeStore, String operationService);
186194

187195
protected MethodDefinition createGenericCallableMethod(
188196
TypeStore typeStore,

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.google.api.generator.gapic.model.Service;
5858
import com.google.api.generator.gapic.utils.JavaStyle;
5959
import com.google.common.base.Preconditions;
60+
import com.google.common.collect.ImmutableList;
6061
import com.google.common.collect.ImmutableMap;
6162
import com.google.longrunning.Operation;
6263
import java.io.IOException;
@@ -152,6 +153,12 @@ public GapicClass generate(GapicContext context, Service service) {
152153
.setType(getTransportContext().transportOperationsStubType())
153154
.build()));
154155
}
156+
157+
boolean operationPollingMethod = checkOperationPollingMethod(service);
158+
if(operationPollingMethod) {
159+
declareLongRunningClient(classMemberVarExprs);
160+
}
161+
155162
classMemberVarExprs.put(
156163
CALLABLE_FACTORY_MEMBER_NAME,
157164
VariableExpr.withVariable(
@@ -383,7 +390,7 @@ protected List<MethodDefinition> createClassMethods(
383390
createOperationsStubGetterMethod(classMemberVarExprs.get(OPERATIONS_STUB_MEMBER_NAME)));
384391
javaMethods.addAll(createCallableGetterMethods(callableClassMemberVarExprs));
385392
javaMethods.addAll(
386-
createStubOverrideMethods(classMemberVarExprs.get(BACKGROUND_RESOURCES_MEMBER_NAME)));
393+
createStubOverrideMethods(classMemberVarExprs.get(BACKGROUND_RESOURCES_MEMBER_NAME), service));
387394
return javaMethods;
388395
}
389396

@@ -625,12 +632,16 @@ protected List<MethodDefinition> createConstructorMethods(
625632
secondCtorExprs.clear();
626633
secondCtorStatements.add(EMPTY_LINE_STATEMENT);
627634

635+
636+
secondCtorStatements.addAll(createLongRunningClient(service, typeStore));
637+
628638
// Instantiate backgroundResources.
629639
MethodInvocationExpr getBackgroundResourcesMethodExpr =
630640
MethodInvocationExpr.builder()
631641
.setExprReferenceExpr(clientContextVarExpr)
632642
.setMethodName("getBackgroundResources")
633643
.build();
644+
634645
VariableExpr backgroundResourcesVarExpr = classMemberVarExprs.get("backgroundResources");
635646
secondCtorExprs.add(
636647
AssignmentExpr.builder()
@@ -655,6 +666,14 @@ protected List<MethodDefinition> createConstructorMethods(
655666
return Arrays.asList(firstCtor, secondCtor);
656667
}
657668

669+
protected List<Statement> createLongRunningClient(Service service, TypeStore typeStore) {
670+
return ImmutableList.of();
671+
}
672+
673+
protected void declareLongRunningClient(Map<String, VariableExpr> classMemberVarExprs) {
674+
675+
}
676+
658677
private static Expr createCallableInitExpr(
659678
String callableVarName,
660679
VariableExpr callableVarExpr,
@@ -762,7 +781,7 @@ private static List<MethodDefinition> createCallableGetterMethods(
762781
}
763782

764783
private List<MethodDefinition> createStubOverrideMethods(
765-
VariableExpr backgroundResourcesVarExpr) {
784+
VariableExpr backgroundResourcesVarExpr, Service service) {
766785
Function<String, MethodDefinition.Builder> methodMakerStarterFn =
767786
methodName ->
768787
MethodDefinition.builder()
@@ -826,6 +845,11 @@ private List<MethodDefinition> createStubOverrideMethods(
826845
.build())
827846
.build();
828847
List<MethodDefinition> javaMethods = new ArrayList<>();
848+
//TODO: check for operation polling method
849+
boolean operationPollingMethod = checkOperationPollingMethod(service);
850+
if (operationPollingMethod) {
851+
getterLongRunningClient(javaMethods);
852+
}
829853
javaMethods.add(
830854
methodMakerStarterFn
831855
.apply("close")
@@ -898,6 +922,19 @@ private List<MethodDefinition> createStubOverrideMethods(
898922
return javaMethods;
899923
}
900924

925+
private boolean checkOperationPollingMethod(Service service) {
926+
for(Method method : service.methods()) {
927+
if(method.isOperationPollingMethod()) {
928+
return true;
929+
}
930+
}
931+
return false;
932+
}
933+
934+
protected void getterLongRunningClient(List<MethodDefinition> javaMethods) {
935+
936+
}
937+
901938
private TypeStore createDynamicTypes(Service service, String stubPakkage) {
902939
TypeStore typeStore = new TypeStore();
903940
typeStore.putAll(

src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ protected List<TypeNode> createClassImplements(TypeStore typeStore) {
4545
return Arrays.asList(getTransportContext().stubCallableFactoryType());
4646
}
4747

48-
protected List<MethodDefinition> createClassMethods(TypeStore typeStore) {
49-
List<MethodDefinition> classMethods = new ArrayList<>(super.createClassMethods(typeStore));
48+
protected List<MethodDefinition> createClassMethods(
49+
TypeStore typeStore, String operationService) {
50+
List<MethodDefinition> classMethods =
51+
new ArrayList<>(super.createClassMethods(typeStore, operationService));
5052
classMethods.addAll(
5153
Arrays.asList(
5254
createBidiStreamingCallableMethod(typeStore),
@@ -98,7 +100,8 @@ protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) {
98100
}
99101

100102
@Override
101-
protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
103+
protected MethodDefinition createOperationCallableMethod(
104+
TypeStore typeStore, String operationService) {
102105
String methodVariantName = "Operation";
103106
String requestTemplateName = "RequestT";
104107
String responseTemplateName = "ResponseT";

src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java

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

1717
import com.google.api.gax.core.BackgroundResource;
18-
import com.google.api.gax.httpjson.ApiMessage;
1918
import com.google.api.gax.httpjson.HttpJsonCallableFactory;
2019
import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
2120
import com.google.api.gax.rpc.OperationCallable;
@@ -47,7 +46,7 @@ public class HttpJsonServiceCallableFactoryClassComposer
4746
new HttpJsonServiceCallableFactoryClassComposer();
4847

4948
private static final TypeNode MESSAGE_TYPE =
50-
TypeNode.withReference(ConcreteReference.withClazz(ApiMessage.class));
49+
TypeNode.withReference(ConcreteReference.withClazz(Operation.class));
5150
private static final TypeNode BACKGROUND_RESOURCE_TYPE =
5251
TypeNode.withReference(ConcreteReference.withClazz(BackgroundResource.class));
5352

@@ -86,7 +85,8 @@ protected List<TypeNode> createClassImplements(TypeStore typeStore) {
8685
}
8786

8887
@Override
89-
protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
88+
protected MethodDefinition createOperationCallableMethod(
89+
TypeStore typeStore, String operationService) {
9090
String methodVariantName = "Operation";
9191
String requestTemplateName = "RequestT";
9292
String responseTemplateName = "ResponseT";
@@ -104,6 +104,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
104104
+ " future.");
105105

106106
// Generate generic method without the body
107+
// TODO: change static usages to vapor references
107108
MethodDefinition method =
108109
createGenericCallableMethod(
109110
typeStore,
@@ -119,13 +120,25 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
119120
.collect(Collectors.toList()),
120121
Arrays.asList(betaAnnotation));
121122

123+
// if (operationService.equals("")) {
124+
// return method.toBuilder().setReturnExpr(ValueExpr.createNullExpr()).build();
125+
// }
126+
122127
List<Statement> createOperationCallableBody = new ArrayList<Statement>(2);
123128

124-
List<VariableExpr> arguments = method.arguments();
129+
List<VariableExpr> arguments = new ArrayList<>(method.arguments());
130+
// Variable stubVar = arguments.get(3).variable();
131+
// stubVar = Variable.builder()
132+
// .setName(stubVar.identifier().name())
133+
// .setType(typeStore.get(operationService+"Stub"))
134+
// .build();
135+
// arguments.set(3,VariableExpr.withVariable(stubVar));
136+
// method = method.toBuilder().setArguments(arguments).build();
137+
125138
Variable httpJsonCallSettingsVar = arguments.get(0).variable();
126-
Variable callSettingsVar = arguments.get(1).variable();
139+
Variable operationCallSettingsVar = arguments.get(1).variable();
127140
Variable clientContextVar = arguments.get(2).variable();
128-
Variable operationsStub = arguments.get(3).variable();
141+
Variable operationsStubVar = arguments.get(3).variable();
129142
// Generate innerCallable
130143
VariableExpr innerCallableVarExpr =
131144
VariableExpr.builder()
@@ -139,7 +152,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
139152
.build();
140153
MethodInvocationExpr getInitialCallSettingsExpr =
141154
MethodInvocationExpr.builder()
142-
.setExprReferenceExpr(VariableExpr.withVariable(callSettingsVar))
155+
.setExprReferenceExpr(VariableExpr.withVariable(operationCallSettingsVar))
143156
.setMethodName("getInitialCallSettings")
144157
.build();
145158
MethodInvocationExpr createBaseUnaryCallableExpr =
@@ -160,16 +173,30 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
160173
.build();
161174
createOperationCallableBody.add(ExprStatement.withExpr(innerCallableAssignExpr));
162175

176+
// This is a temporary solution
177+
VaporReference requestT =
178+
VaporReference.builder()
179+
.setName("RequestT")
180+
.setPakkage("com.google.cloud.compute.v1.stub")
181+
.build();
182+
183+
TypeNode initialCallableType =
184+
TypeNode.withReference(
185+
ConcreteReference.builder()
186+
.setClazz(HttpJsonOperationSnapshotCallable.class)
187+
.setGenerics(requestT, ConcreteReference.withClazz(Operation.class))
188+
.build());
189+
163190
// Generate initialCallable
164191
VariableExpr initialCallableVarExpr =
165192
VariableExpr.builder()
166193
.setVariable(
167194
Variable.builder()
168195
.setName("initialCallable")
169196
.setType(
170-
TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
197+
initialCallableType) // TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
171198
.build())
172-
.setTemplateObjects(Arrays.asList(requestTemplateName, methodVariantName))
199+
// .setTemplateObjects(Arrays.asList(requestTemplateName, "OperationSnapshot"))
173200
.build();
174201
MethodInvocationExpr getMethodDescriptorExpr =
175202
MethodInvocationExpr.builder()
@@ -181,12 +208,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
181208
.setExprReferenceExpr(getMethodDescriptorExpr)
182209
.setMethodName("getOperationSnapshotFactory")
183210
.build();
184-
// This is a temporary solution
185-
VaporReference requestT =
186-
VaporReference.builder()
187-
.setName("RequestT")
188-
.setPakkage("com.google.cloud.compute.v1.stub")
189-
.build();
211+
190212
TypeNode operationSnapshotCallableType =
191213
TypeNode.withReference(
192214
ConcreteReference.builder()
@@ -209,7 +231,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
209231
// Generate return statement
210232
MethodInvocationExpr longRunningClient =
211233
MethodInvocationExpr.builder()
212-
.setExprReferenceExpr(VariableExpr.withVariable(operationsStub))
234+
.setExprReferenceExpr(VariableExpr.withVariable(operationsStubVar))
213235
.setMethodName("longRunningClient")
214236
.build();
215237
MethodInvocationExpr createOperationCallable =
@@ -218,7 +240,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
218240
TypeNode.withReference(ConcreteReference.withClazz(HttpJsonCallableFactory.class)))
219241
.setMethodName("createOperationCallable")
220242
.setArguments(
221-
VariableExpr.withVariable(callSettingsVar),
243+
VariableExpr.withVariable(operationCallSettingsVar),
222244
VariableExpr.withVariable(clientContextVar),
223245
longRunningClient,
224246
initialCallableVarExpr)

0 commit comments

Comments
 (0)