1616
1717import com .google .api .gax .core .BackgroundResource ;
1818import 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 ;
1923import com .google .api .generator .engine .ast .AnnotationNode ;
24+ import com .google .api .generator .engine .ast .AssignmentExpr ;
2025import com .google .api .generator .engine .ast .ConcreteReference ;
26+ import com .google .api .generator .engine .ast .ExprStatement ;
2127import 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 ;
2231import 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 ;
2435import com .google .api .generator .gapic .composer .common .AbstractServiceCallableFactoryClassComposer ;
2536import com .google .api .generator .gapic .composer .store .TypeStore ;
2637import com .google .api .generator .gapic .model .Service ;
38+ import com .google .longrunning .Operation ;
39+ import java .util .ArrayList ;
2740import java .util .Arrays ;
2841import java .util .List ;
2942import 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