Skip to content
This repository was archived by the owner on May 14, 2026. It is now read-only.

Commit 35cc21c

Browse files
DIREGAPIC LRO implementation without annotations (#826)
* 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
1 parent a0f88b9 commit 35cc21c

10 files changed

Lines changed: 550 additions & 14 deletions

File tree

WORKSPACE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +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-
_gax_java_version = "1.65.1"
35+
_gax_java_version = "2.2.0"
3636

3737
http_archive(
3838
name = "com_google_api_gax_java",

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.google.api.generator.gapic.model.GapicClass;
5353
import com.google.api.generator.gapic.model.GapicClass.Kind;
5454
import com.google.api.generator.gapic.model.GapicContext;
55+
import com.google.api.generator.gapic.model.Message;
5556
import com.google.api.generator.gapic.model.Method;
5657
import com.google.api.generator.gapic.model.Service;
5758
import com.google.api.generator.gapic.utils.JavaStyle;
@@ -159,12 +160,14 @@ public GapicClass generate(GapicContext context, Service service) {
159160
.setType(getTransportContext().stubCallableFactoryType())
160161
.build()));
161162

163+
Map<String, Message> messageTypes = context.messages();
162164
List<Statement> classStatements =
163165
createClassStatements(
164166
service,
165167
protoMethodNameToDescriptorVarExprs,
166168
callableClassMemberVarExprs,
167-
classMemberVarExprs);
169+
classMemberVarExprs,
170+
messageTypes);
168171

169172
StubCommentComposer commentComposer =
170173
new StubCommentComposer(getTransportContext().transportName());
@@ -193,7 +196,7 @@ public GapicClass generate(GapicContext context, Service service) {
193196
}
194197

195198
protected abstract Statement createMethodDescriptorVariableDecl(
196-
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr);
199+
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr, Map<String, Message> messageTypes);
197200

198201
protected abstract List<MethodDefinition> createOperationsStubGetterMethod(
199202
VariableExpr operationsStubVarExpr);
@@ -212,10 +215,11 @@ protected List<Statement> createClassStatements(
212215
Service service,
213216
Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs,
214217
Map<String, VariableExpr> callableClassMemberVarExprs,
215-
Map<String, VariableExpr> classMemberVarExprs) {
218+
Map<String, VariableExpr> classMemberVarExprs,
219+
Map<String, Message> messageTypes) {
216220
List<Statement> classStatements = new ArrayList<>();
217221
for (Statement statement :
218-
createMethodDescriptorVariableDecls(service, protoMethodNameToDescriptorVarExprs)) {
222+
createMethodDescriptorVariableDecls(service, protoMethodNameToDescriptorVarExprs, messageTypes)) {
219223
classStatements.add(statement);
220224
classStatements.add(EMPTY_LINE_STATEMENT);
221225
}
@@ -228,12 +232,12 @@ protected List<Statement> createClassStatements(
228232
}
229233

230234
protected List<Statement> createMethodDescriptorVariableDecls(
231-
Service service, Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs) {
235+
Service service, Map<String, VariableExpr> protoMethodNameToDescriptorVarExprs, Map<String, Message> messageTypes) {
232236
return service.methods().stream()
233237
.map(
234238
m ->
235239
createMethodDescriptorVariableDecl(
236-
service, m, protoMethodNameToDescriptorVarExprs.get(m.name())))
240+
service, m, protoMethodNameToDescriptorVarExprs.get(m.name()), messageTypes))
237241
.collect(Collectors.toList());
238242
}
239243

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.google.api.generator.gapic.composer.common.AbstractServiceStubClassComposer;
3535
import com.google.api.generator.gapic.composer.store.TypeStore;
3636
import com.google.api.generator.gapic.model.HttpBindings.HttpBinding;
37+
import com.google.api.generator.gapic.model.Message;
3738
import com.google.api.generator.gapic.model.Method;
3839
import com.google.api.generator.gapic.model.Service;
3940
import com.google.api.generator.gapic.utils.JavaStyle;
@@ -85,7 +86,10 @@ private static TypeStore createStaticTypes() {
8586

8687
@Override
8788
protected Statement createMethodDescriptorVariableDecl(
88-
Service service, Method protoMethod, VariableExpr methodDescriptorVarExpr) {
89+
Service service,
90+
Method protoMethod,
91+
VariableExpr methodDescriptorVarExpr,
92+
Map<String, Message> messageTypes) {
8993
MethodInvocationExpr methodDescriptorMaker =
9094
MethodInvocationExpr.builder()
9195
.setMethodName("newBuilder")

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

Lines changed: 129 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,27 @@
1616

1717
import com.google.api.gax.core.BackgroundResource;
1818
import com.google.api.gax.httpjson.ApiMessage;
19+
import com.google.api.gax.httpjson.HttpJsonCallableFactory;
20+
import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
21+
import com.google.api.gax.rpc.OperationCallable;
22+
import com.google.api.gax.rpc.UnaryCallable;
1923
import com.google.api.generator.engine.ast.AnnotationNode;
24+
import com.google.api.generator.engine.ast.AssignmentExpr;
2025
import com.google.api.generator.engine.ast.ConcreteReference;
26+
import com.google.api.generator.engine.ast.ExprStatement;
2127
import com.google.api.generator.engine.ast.MethodDefinition;
28+
import com.google.api.generator.engine.ast.MethodInvocationExpr;
29+
import com.google.api.generator.engine.ast.NewObjectExpr;
30+
import com.google.api.generator.engine.ast.Statement;
2231
import com.google.api.generator.engine.ast.TypeNode;
23-
import com.google.api.generator.engine.ast.ValueExpr;
32+
import com.google.api.generator.engine.ast.VaporReference;
33+
import com.google.api.generator.engine.ast.Variable;
34+
import com.google.api.generator.engine.ast.VariableExpr;
2435
import com.google.api.generator.gapic.composer.common.AbstractServiceCallableFactoryClassComposer;
2536
import com.google.api.generator.gapic.composer.store.TypeStore;
2637
import com.google.api.generator.gapic.model.Service;
38+
import com.google.longrunning.Operation;
39+
import java.util.ArrayList;
2740
import java.util.Arrays;
2841
import java.util.List;
2942
import java.util.stream.Collectors;
@@ -90,6 +103,7 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
90103
"The surface for long-running operations is not stable yet and may change in the"
91104
+ " future.");
92105

106+
// Generate generic method without the body
93107
MethodDefinition method =
94108
createGenericCallableMethod(
95109
typeStore,
@@ -104,6 +118,119 @@ protected MethodDefinition createOperationCallableMethod(TypeStore typeStore) {
104118
.map(n -> (Object) n)
105119
.collect(Collectors.toList()),
106120
Arrays.asList(betaAnnotation));
107-
return method.toBuilder().setReturnExpr(ValueExpr.createNullExpr()).build();
121+
122+
List<Statement> createOperationCallableBody = new ArrayList<Statement>(2);
123+
124+
List<VariableExpr> arguments = method.arguments();
125+
Variable httpJsonCallSettingsVar = arguments.get(0).variable();
126+
Variable callSettingsVar = arguments.get(1).variable();
127+
Variable clientContextVar = arguments.get(2).variable();
128+
Variable operationsStub = arguments.get(3).variable();
129+
// Generate innerCallable
130+
VariableExpr innerCallableVarExpr =
131+
VariableExpr.builder()
132+
.setVariable(
133+
Variable.builder()
134+
.setName("innerCallable")
135+
.setType(
136+
TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
137+
.build())
138+
.setTemplateObjects(Arrays.asList(requestTemplateName, methodVariantName))
139+
.build();
140+
MethodInvocationExpr getInitialCallSettingsExpr =
141+
MethodInvocationExpr.builder()
142+
.setExprReferenceExpr(VariableExpr.withVariable(callSettingsVar))
143+
.setMethodName("getInitialCallSettings")
144+
.build();
145+
MethodInvocationExpr createBaseUnaryCallableExpr =
146+
MethodInvocationExpr.builder()
147+
.setStaticReferenceType(
148+
TypeNode.withReference(ConcreteReference.withClazz(HttpJsonCallableFactory.class)))
149+
.setMethodName("createBaseUnaryCallable")
150+
.setArguments(
151+
VariableExpr.withVariable(httpJsonCallSettingsVar),
152+
getInitialCallSettingsExpr,
153+
VariableExpr.withVariable(clientContextVar))
154+
.setReturnType(TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
155+
.build();
156+
AssignmentExpr innerCallableAssignExpr =
157+
AssignmentExpr.builder()
158+
.setVariableExpr(innerCallableVarExpr.toBuilder().setIsDecl(true).build())
159+
.setValueExpr(createBaseUnaryCallableExpr)
160+
.build();
161+
createOperationCallableBody.add(ExprStatement.withExpr(innerCallableAssignExpr));
162+
163+
// Generate initialCallable
164+
VariableExpr initialCallableVarExpr =
165+
VariableExpr.builder()
166+
.setVariable(
167+
Variable.builder()
168+
.setName("initialCallable")
169+
.setType(
170+
TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class)))
171+
.build())
172+
.setTemplateObjects(Arrays.asList(requestTemplateName, methodVariantName))
173+
.build();
174+
MethodInvocationExpr getMethodDescriptorExpr =
175+
MethodInvocationExpr.builder()
176+
.setExprReferenceExpr(VariableExpr.withVariable(httpJsonCallSettingsVar))
177+
.setMethodName("getMethodDescriptor")
178+
.build();
179+
MethodInvocationExpr getOperationSnapshotFactoryExpr =
180+
MethodInvocationExpr.builder()
181+
.setExprReferenceExpr(getMethodDescriptorExpr)
182+
.setMethodName("getOperationSnapshotFactory")
183+
.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();
190+
TypeNode operationSnapshotCallableType =
191+
TypeNode.withReference(
192+
ConcreteReference.builder()
193+
.setClazz(HttpJsonOperationSnapshotCallable.class)
194+
.setGenerics(requestT, ConcreteReference.withClazz(Operation.class))
195+
.build());
196+
NewObjectExpr initialCallableObject =
197+
NewObjectExpr.builder()
198+
.setType(operationSnapshotCallableType)
199+
.setIsGeneric(true)
200+
.setArguments(innerCallableVarExpr, getOperationSnapshotFactoryExpr)
201+
.build();
202+
AssignmentExpr initialCallableAssignExpr =
203+
AssignmentExpr.builder()
204+
.setVariableExpr(initialCallableVarExpr.toBuilder().setIsDecl(true).build())
205+
.setValueExpr(initialCallableObject)
206+
.build();
207+
createOperationCallableBody.add(ExprStatement.withExpr(initialCallableAssignExpr));
208+
209+
// Generate return statement
210+
MethodInvocationExpr longRunningClient =
211+
MethodInvocationExpr.builder()
212+
.setExprReferenceExpr(VariableExpr.withVariable(operationsStub))
213+
.setMethodName("longRunningClient")
214+
.build();
215+
MethodInvocationExpr createOperationCallable =
216+
MethodInvocationExpr.builder()
217+
.setStaticReferenceType(
218+
TypeNode.withReference(ConcreteReference.withClazz(HttpJsonCallableFactory.class)))
219+
.setMethodName("createOperationCallable")
220+
.setArguments(
221+
VariableExpr.withVariable(callSettingsVar),
222+
VariableExpr.withVariable(clientContextVar),
223+
longRunningClient,
224+
initialCallableVarExpr)
225+
.setReturnType(
226+
TypeNode.withReference(ConcreteReference.withClazz(OperationCallable.class)))
227+
.build();
228+
229+
// Add body and return statement to method
230+
return method
231+
.toBuilder()
232+
.setBody(createOperationCallableBody)
233+
.setReturnExpr(createOperationCallable)
234+
.build();
108235
}
109236
}

0 commit comments

Comments
 (0)