Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e8fce2f

Browse files
committed
[samplecode][2/3]Implemente Unary Paged RPC method's sample code (#576)
1 parent 68a41f1 commit e8fce2f

File tree

10 files changed

+764
-54
lines changed

10 files changed

+764
-54
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -568,13 +568,13 @@ private static List<MethodDefinition> createMethodVariants(
568568
.build();
569569

570570
Optional<String> methodSampleCode = Optional.empty();
571-
if (!method.isPaged() && !method.hasLro()) {
572-
// TODO(summerji): Remove the condition check once finished the implementation on paged
573-
// sample code and lro sample code.
571+
if (!method.hasLro()) {
572+
// TODO(summerji): Remove the condition check once finished the implementation on lro sample
573+
// code.
574574
methodSampleCode =
575575
Optional.of(
576576
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
577-
method, types.get(clientName), signature, resourceNames));
577+
method, types.get(clientName), signature, resourceNames, messageTypes));
578578
}
579579
MethodDefinition.Builder methodVariantBuilder =
580580
MethodDefinition.builder()

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

Lines changed: 146 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,32 @@
1616

1717
import com.google.api.gax.core.FixedCredentialsProvider;
1818
import com.google.api.generator.engine.ast.AssignmentExpr;
19+
import com.google.api.generator.engine.ast.CommentStatement;
1920
import com.google.api.generator.engine.ast.ConcreteReference;
2021
import com.google.api.generator.engine.ast.Expr;
2122
import com.google.api.generator.engine.ast.ExprStatement;
23+
import com.google.api.generator.engine.ast.ForStatement;
24+
import com.google.api.generator.engine.ast.LineComment;
2225
import com.google.api.generator.engine.ast.MethodInvocationExpr;
26+
import com.google.api.generator.engine.ast.Statement;
2327
import com.google.api.generator.engine.ast.TryCatchStatement;
2428
import com.google.api.generator.engine.ast.TypeNode;
2529
import com.google.api.generator.engine.ast.VaporReference;
2630
import com.google.api.generator.engine.ast.Variable;
2731
import com.google.api.generator.engine.ast.VariableExpr;
2832
import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter;
33+
import com.google.api.generator.gapic.model.Field;
34+
import com.google.api.generator.gapic.model.Message;
2935
import com.google.api.generator.gapic.model.Method;
3036
import com.google.api.generator.gapic.model.MethodArgument;
3137
import com.google.api.generator.gapic.model.ResourceName;
3238
import com.google.api.generator.gapic.utils.JavaStyle;
3339
import com.google.common.annotations.VisibleForTesting;
3440
import com.google.common.base.Preconditions;
35-
import java.util.ArrayList;
3641
import java.util.Arrays;
3742
import java.util.List;
3843
import java.util.Map;
44+
import java.util.function.Function;
3945
import java.util.stream.Collectors;
4046
import java.util.stream.IntStream;
4147

@@ -186,8 +192,24 @@ public static String composeRpcMethodHeaderSampleCode(
186192
Method method,
187193
TypeNode clientType,
188194
List<MethodArgument> arguments,
189-
Map<String, ResourceName> resourceNames) {
195+
Map<String, ResourceName> resourceNames,
196+
Map<String, Message> messageTypes) {
190197
// TODO(summerji): Add other types RPC methods' sample code.
198+
if (method.isPaged()) {
199+
// Find the repeated field.
200+
Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName());
201+
Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField();
202+
Preconditions.checkNotNull(
203+
repeatedPagedResultsField,
204+
String.format(
205+
"No repeated field found on message %s for method %s",
206+
methodOutputMessage.name(), method.name()));
207+
208+
TypeNode repeatedResponseType = repeatedPagedResultsField.type();
209+
return SampleCodeWriter.write(
210+
composeUnaryPagedRpcMethodSampleCode(
211+
method, clientType, repeatedResponseType, arguments, resourceNames));
212+
}
191213
return SampleCodeWriter.write(
192214
composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames));
193215
}
@@ -204,52 +226,12 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
204226
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
205227
.setType(clientType)
206228
.build());
207-
// List of rpc method arguments' variable expressions.
208-
List<VariableExpr> rpcMethodArgVarExprs =
209-
arguments.stream()
210-
.map(
211-
arg ->
212-
VariableExpr.withVariable(
213-
Variable.builder()
214-
.setName(JavaStyle.toLowerCamelCase(arg.name()))
215-
.setType(arg.type())
216-
.build()))
217-
.collect(Collectors.toList());
218-
// List of rpc method arguments' default value expression.
219-
List<ResourceName> resourceNameList =
220-
resourceNames.values().stream().collect(Collectors.toList());
229+
List<VariableExpr> rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
221230
List<Expr> rpcMethodArgDefaultValueExprs =
222-
arguments.stream()
223-
.map(
224-
arg ->
225-
!isStringTypedResourceName(arg, resourceNames)
226-
? DefaultValueComposer.createDefaultValue(arg, resourceNames)
227-
: MethodInvocationExpr.builder()
228-
.setExprReferenceExpr(
229-
DefaultValueComposer.createDefaultValue(
230-
resourceNames.get(
231-
arg.field().resourceReference().resourceTypeString()),
232-
resourceNameList,
233-
arg.field().name()))
234-
.setMethodName("toString")
235-
.setReturnType(TypeNode.STRING)
236-
.build())
237-
.collect(Collectors.toList());
238-
239-
List<Expr> bodyExprs = new ArrayList<>();
240-
Preconditions.checkState(
241-
rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
242-
"Expected the number of method arguments to match the number of default values.");
243-
bodyExprs.addAll(
244-
IntStream.range(0, rpcMethodArgVarExprs.size())
245-
.mapToObj(
246-
i ->
247-
AssignmentExpr.builder()
248-
.setVariableExpr(
249-
(rpcMethodArgVarExprs.get(i)).toBuilder().setIsDecl(true).build())
250-
.setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
251-
.build())
252-
.collect(Collectors.toList()));
231+
createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
232+
List<Expr> bodyExprs =
233+
createAssignmentsForVarExprsWithValueExprs(
234+
rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
253235
// Invoke current method based on return type.
254236
// e.g. if return void, echoClient.echo(..); or,
255237
// e.g. if return other type, EchoResponse response = echoClient.echo(...);
@@ -290,8 +272,125 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
290272
.build();
291273
}
292274

275+
@VisibleForTesting
276+
static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
277+
Method method,
278+
TypeNode clientType,
279+
TypeNode repeatedResponseType,
280+
List<MethodArgument> arguments,
281+
Map<String, ResourceName> resourceNames) {
282+
VariableExpr clientVarExpr =
283+
VariableExpr.withVariable(
284+
Variable.builder()
285+
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
286+
.setType(clientType)
287+
.build());
288+
List<VariableExpr> rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
289+
List<Expr> rpcMethodArgDefaultValueExprs =
290+
createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
291+
List<Expr> bodyExprs =
292+
createAssignmentsForVarExprsWithValueExprs(
293+
rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
294+
// For loop paged response item on iterateAll method.
295+
// e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
296+
// //doThingsWith(element);
297+
// }
298+
MethodInvocationExpr clientMethodExpr =
299+
MethodInvocationExpr.builder()
300+
.setExprReferenceExpr(clientVarExpr)
301+
.setMethodName(JavaStyle.toLowerCamelCase(method.name()))
302+
.setArguments(
303+
rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
304+
.build();
305+
Expr clientMethodIteratorAllExpr =
306+
MethodInvocationExpr.builder()
307+
.setExprReferenceExpr(clientMethodExpr)
308+
.setMethodName("iterateAll")
309+
.setReturnType(repeatedResponseType)
310+
.build();
311+
ForStatement loopIteratorStatement =
312+
ForStatement.builder()
313+
.setLocalVariableExpr(
314+
VariableExpr.builder()
315+
.setVariable(
316+
Variable.builder().setName("element").setType(repeatedResponseType).build())
317+
.setIsDecl(true)
318+
.build())
319+
.setCollectionExpr(clientMethodIteratorAllExpr)
320+
.setBody(
321+
Arrays.asList(
322+
CommentStatement.withComment(
323+
LineComment.withComment("doThingsWith(element);"))))
324+
.build();
325+
326+
List<Statement> bodyStatements =
327+
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
328+
bodyStatements.add(loopIteratorStatement);
329+
330+
return TryCatchStatement.builder()
331+
.setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
332+
.setTryBody(bodyStatements)
333+
.setIsSampleCode(true)
334+
.build();
335+
}
336+
293337
// ==================================Helpers===================================================//
294338

339+
// Create a list of RPC method arguments' variable expressions.
340+
private static List<VariableExpr> createRpcMethodArgumentVariableExprs(
341+
List<MethodArgument> arguments) {
342+
return arguments.stream()
343+
.map(
344+
arg ->
345+
VariableExpr.withVariable(
346+
Variable.builder()
347+
.setName(JavaStyle.toLowerCamelCase(arg.name()))
348+
.setType(arg.type())
349+
.build()))
350+
.collect(Collectors.toList());
351+
}
352+
353+
// Create a list of RPC method arguments' default value expression.
354+
private static List<Expr> createRpcMethodArgumentDefaultValueExprs(
355+
List<MethodArgument> arguments, Map<String, ResourceName> resourceNames) {
356+
List<ResourceName> resourceNameList =
357+
resourceNames.values().stream().collect(Collectors.toList());
358+
Function<MethodArgument, MethodInvocationExpr> stringResourceNameDefaultValueExpr =
359+
arg ->
360+
MethodInvocationExpr.builder()
361+
.setExprReferenceExpr(
362+
DefaultValueComposer.createDefaultValue(
363+
resourceNames.get(arg.field().resourceReference().resourceTypeString()),
364+
resourceNameList,
365+
arg.field().name()))
366+
.setMethodName("toString")
367+
.setReturnType(TypeNode.STRING)
368+
.build();
369+
return arguments.stream()
370+
.map(
371+
arg ->
372+
!isStringTypedResourceName(arg, resourceNames)
373+
? DefaultValueComposer.createDefaultValue(arg, resourceNames)
374+
: stringResourceNameDefaultValueExpr.apply(arg))
375+
.collect(Collectors.toList());
376+
}
377+
378+
// Create a list of assignment expressions for variable expr with value expr.
379+
private static List<Expr> createAssignmentsForVarExprsWithValueExprs(
380+
List<VariableExpr> variableExprs, List<Expr> valueExprs) {
381+
Preconditions.checkState(
382+
variableExprs.size() == valueExprs.size(),
383+
"Expected the number of method arguments to match the number of default values.");
384+
return IntStream.range(0, variableExprs.size())
385+
.mapToObj(
386+
i ->
387+
AssignmentExpr.builder()
388+
.setVariableExpr(variableExprs.get(i).toBuilder().setIsDecl(true).build())
389+
.setValueExpr(valueExprs.get(i))
390+
.build())
391+
.collect(Collectors.toList());
392+
}
393+
295394
// Assign client variable expr with create client.
296395
// e.g EchoClient echoClient = EchoClient.create()
297396
private static AssignmentExpr assignClientVariableWithCreateMethodExpr(

0 commit comments

Comments
 (0)