Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[samplecode][2/3]Implemente Unary Paged RPC method's sample code #576

Merged
merged 34 commits into from
Dec 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
2ada597
Flattern the createVariableExpr wrapper (#581)
summer-ji-eng Dec 3, 2020
0b70f9d
[samplecode][1/3]Implement Pure Unary RPC sample code (#573)
summer-ji-eng Dec 9, 2020
aeac127
Add resource name into ClassComposer interface
summer-ji-eng Nov 25, 2020
1caf9d9
Remove resource name from class composer interface
summer-ji-eng Nov 25, 2020
6337c07
Remove bug ticket
summer-ji-eng Nov 26, 2020
42beeac
move todo
summer-ji-eng Dec 2, 2020
de9e827
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
c06bc37
modify body expr
summer-ji-eng Dec 1, 2020
58b366a
flattern varialbe expr and fix default value string
summer-ji-eng Dec 3, 2020
39d75ad
merge HelperComposer into ServiceClientSampleCodeComposer
summer-ji-eng Dec 3, 2020
0d92845
Add license
summer-ji-eng Dec 3, 2020
b24146f
Flattern the createVariableExpr wrapper (#581)
summer-ji-eng Dec 3, 2020
4735c40
refactor assignment expr of default value on method arguments
summer-ji-eng Dec 4, 2020
48c308c
remove unused method
summer-ji-eng Dec 4, 2020
9d26694
Add edge case for unit test, and address the comments
summer-ji-eng Dec 4, 2020
77bcf08
rebase master changes
summer-ji-eng Dec 5, 2020
50a143e
fix unit test
summer-ji-eng Dec 5, 2020
f43b850
Make composeUnaryRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
4254427
reorder the parameters
summer-ji-eng Dec 8, 2020
f43fa63
update unit test
summer-ji-eng Dec 9, 2020
443404a
Implement Pure Unary RPC sample code
summer-ji-eng Nov 26, 2020
55d2f42
Implemente Unary Paged RPC method's sample code
summer-ji-eng Nov 30, 2020
b8a9f00
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
e20d870
rebase previous PR and address the comments
summer-ji-eng Dec 5, 2020
8e0e7e7
rebase previous PR
summer-ji-eng Dec 5, 2020
21bf8b4
Make composeUnaryPagedRpcMethodSampleCode VisibleForTesting
summer-ji-eng Dec 6, 2020
22a77aa
abstract functions for reuse
summer-ji-eng Dec 8, 2020
dbf522f
Unwrap a helper function
summer-ji-eng Dec 8, 2020
a043004
Use Function Interface
summer-ji-eng Dec 9, 2020
85c9e3a
fix typo
summer-ji-eng Dec 9, 2020
f89208e
Merge branch 'samplecode-master' into paged_unary_rpc_2
summer-ji-eng Dec 9, 2020
6d822c3
reorder parameters
summer-ji-eng Dec 9, 2020
bba7c84
reorder arguments
summer-ji-eng Dec 9, 2020
095c0ef
Merge branch 'samplecode-master' into paged_unary_rpc_2
summer-ji-eng Dec 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -566,13 +566,13 @@ private static List<MethodDefinition> createMethodVariants(
.build();

Optional<String> methodSampleCode = Optional.empty();
if (!method.isPaged() && !method.hasLro()) {
// TODO(summerji): Remove the condition check once finished the implementation on paged
// sample code and lro sample code.
if (!method.hasLro()) {
// TODO(summerji): Remove the condition check once finished the implementation on lro sample
// code.
methodSampleCode =
Optional.of(
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, types.get(clientName), signature, resourceNames));
method, types.get(clientName), signature, resourceNames, messageTypes));
}
MethodDefinition.Builder methodVariantBuilder =
MethodDefinition.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,32 @@

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.generator.engine.ast.AssignmentExpr;
import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.engine.ast.ConcreteReference;
import com.google.api.generator.engine.ast.Expr;
import com.google.api.generator.engine.ast.ExprStatement;
import com.google.api.generator.engine.ast.ForStatement;
import com.google.api.generator.engine.ast.LineComment;
import com.google.api.generator.engine.ast.MethodInvocationExpr;
import com.google.api.generator.engine.ast.Statement;
import com.google.api.generator.engine.ast.TryCatchStatement;
import com.google.api.generator.engine.ast.TypeNode;
import com.google.api.generator.engine.ast.VaporReference;
import com.google.api.generator.engine.ast.Variable;
import com.google.api.generator.engine.ast.VariableExpr;
import com.google.api.generator.gapic.composer.samplecode.SampleCodeWriter;
import com.google.api.generator.gapic.model.Field;
import com.google.api.generator.gapic.model.Message;
import com.google.api.generator.gapic.model.Method;
import com.google.api.generator.gapic.model.MethodArgument;
import com.google.api.generator.gapic.model.ResourceName;
import com.google.api.generator.gapic.utils.JavaStyle;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

Expand Down Expand Up @@ -186,8 +192,24 @@ public static String composeRpcMethodHeaderSampleCode(
Method method,
TypeNode clientType,
List<MethodArgument> arguments,
Map<String, ResourceName> resourceNames) {
Map<String, ResourceName> resourceNames,
Map<String, Message> messageTypes) {
// TODO(summerji): Add other types RPC methods' sample code.
if (method.isPaged()) {
// Find the repeated field.
Message methodOutputMessage = messageTypes.get(method.outputType().reference().simpleName());
Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapFirstRepeatedField();
Preconditions.checkNotNull(
repeatedPagedResultsField,
String.format(
"No repeated field found on message %s for method %s",
methodOutputMessage.name(), method.name()));

TypeNode repeatedResponseType = repeatedPagedResultsField.type();
return SampleCodeWriter.write(
composeUnaryPagedRpcMethodSampleCode(
method, clientType, repeatedResponseType, arguments, resourceNames));
}
return SampleCodeWriter.write(
composeUnaryRpcMethodSampleCode(method, clientType, arguments, resourceNames));
}
Expand All @@ -204,52 +226,12 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
// List of rpc method arguments' variable expressions.
List<VariableExpr> rpcMethodArgVarExprs =
arguments.stream()
.map(
arg ->
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(arg.name()))
.setType(arg.type())
.build()))
.collect(Collectors.toList());
// List of rpc method arguments' default value expression.
List<ResourceName> resourceNameList =
resourceNames.values().stream().collect(Collectors.toList());
List<VariableExpr> rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
List<Expr> rpcMethodArgDefaultValueExprs =
arguments.stream()
.map(
arg ->
!isStringTypedResourceName(arg, resourceNames)
? DefaultValueComposer.createDefaultValue(arg, resourceNames)
: MethodInvocationExpr.builder()
.setExprReferenceExpr(
DefaultValueComposer.createDefaultValue(
resourceNames.get(
arg.field().resourceReference().resourceTypeString()),
resourceNameList,
arg.field().name()))
.setMethodName("toString")
.setReturnType(TypeNode.STRING)
.build())
.collect(Collectors.toList());

List<Expr> bodyExprs = new ArrayList<>();
Preconditions.checkState(
rpcMethodArgVarExprs.size() == rpcMethodArgDefaultValueExprs.size(),
"Expected the number of method arguments to match the number of default values.");
bodyExprs.addAll(
IntStream.range(0, rpcMethodArgVarExprs.size())
.mapToObj(
i ->
AssignmentExpr.builder()
.setVariableExpr(
(rpcMethodArgVarExprs.get(i)).toBuilder().setIsDecl(true).build())
.setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
.build())
.collect(Collectors.toList()));
createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
List<Expr> bodyExprs =
createAssignmentsForVarExprsWithValueExprs(
rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
// Invoke current method based on return type.
// e.g. if return void, echoClient.echo(..); or,
// e.g. if return other type, EchoResponse response = echoClient.echo(...);
Expand Down Expand Up @@ -290,8 +272,125 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
.build();
}

@VisibleForTesting
static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
Method method,
TypeNode clientType,
summer-ji-eng marked this conversation as resolved.
Show resolved Hide resolved
TypeNode repeatedResponseType,
List<MethodArgument> arguments,
Map<String, ResourceName> resourceNames) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
List<VariableExpr> rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
List<Expr> rpcMethodArgDefaultValueExprs =
summer-ji-eng marked this conversation as resolved.
Show resolved Hide resolved
createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
List<Expr> bodyExprs =
createAssignmentsForVarExprsWithValueExprs(
rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
// For loop paged response item on iterateAll method.
// e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
// //doThingsWith(element);
// }
MethodInvocationExpr clientMethodExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(JavaStyle.toLowerCamelCase(method.name()))
.setArguments(
rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
.build();
Expr clientMethodIteratorAllExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientMethodExpr)
.setMethodName("iterateAll")
.setReturnType(repeatedResponseType)
.build();
ForStatement loopIteratorStatement =
ForStatement.builder()
.setLocalVariableExpr(
VariableExpr.builder()
.setVariable(
Variable.builder().setName("element").setType(repeatedResponseType).build())
.setIsDecl(true)
.build())
.setCollectionExpr(clientMethodIteratorAllExpr)
.setBody(
Arrays.asList(
summer-ji-eng marked this conversation as resolved.
Show resolved Hide resolved
CommentStatement.withComment(
LineComment.withComment("doThingsWith(element);"))))
.build();

List<Statement> bodyStatements =
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
bodyStatements.add(loopIteratorStatement);

return TryCatchStatement.builder()
.setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
.setTryBody(bodyStatements)
.setIsSampleCode(true)
.build();
}

// ==================================Helpers===================================================//

// Create a list of RPC method arguments' variable expressions.
private static List<VariableExpr> createRpcMethodArgumentVariableExprs(
List<MethodArgument> arguments) {
return arguments.stream()
.map(
arg ->
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(arg.name()))
.setType(arg.type())
.build()))
.collect(Collectors.toList());
}

// Create a list of RPC method arguments' default value expression.
private static List<Expr> createRpcMethodArgumentDefaultValueExprs(
List<MethodArgument> arguments, Map<String, ResourceName> resourceNames) {
List<ResourceName> resourceNameList =
resourceNames.values().stream().collect(Collectors.toList());
Function<MethodArgument, MethodInvocationExpr> stringResourceNameDefaultValueExpr =
arg ->
MethodInvocationExpr.builder()
.setExprReferenceExpr(
DefaultValueComposer.createDefaultValue(
resourceNames.get(arg.field().resourceReference().resourceTypeString()),
resourceNameList,
arg.field().name()))
.setMethodName("toString")
.setReturnType(TypeNode.STRING)
.build();
return arguments.stream()
.map(
arg ->
!isStringTypedResourceName(arg, resourceNames)
summer-ji-eng marked this conversation as resolved.
Show resolved Hide resolved
? DefaultValueComposer.createDefaultValue(arg, resourceNames)
: stringResourceNameDefaultValueExpr.apply(arg))
.collect(Collectors.toList());
}

// Create a list of assignment expressions for variable expr with value expr.
private static List<Expr> createAssignmentsForVarExprsWithValueExprs(
List<VariableExpr> variableExprs, List<Expr> valueExprs) {
Preconditions.checkState(
variableExprs.size() == valueExprs.size(),
"Expected the number of method arguments to match the number of default values.");
return IntStream.range(0, variableExprs.size())
.mapToObj(
i ->
AssignmentExpr.builder()
summer-ji-eng marked this conversation as resolved.
Show resolved Hide resolved
.setVariableExpr(variableExprs.get(i).toBuilder().setIsDecl(true).build())
.setValueExpr(valueExprs.get(i))
.build())
.collect(Collectors.toList());
}

// Assign client variable expr with create client.
// e.g EchoClient echoClient = EchoClient.create()
private static AssignmentExpr assignClientVariableWithCreateMethodExpr(
Expand Down
Loading