Skip to content

Commit

Permalink
rebase previous PR and address the comments
Browse files Browse the repository at this point in the history
  • Loading branch information
summer-ji-eng committed Dec 5, 2020
1 parent e96e657 commit 62854af
Show file tree
Hide file tree
Showing 8 changed files with 333 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -480,11 +480,11 @@ private static List<MethodDefinition> createServiceMethods(
Map<String, TypeNode> types,
Map<String, ResourceName> resourceNames) {
List<MethodDefinition> javaMethods = new ArrayList<>();
String clientName = getClientClassName(service);
for (Method method : service.methods()) {
if (method.stream().equals(Stream.NONE)) {
javaMethods.addAll(
createMethodVariants(method, messageTypes, types, clientName, resourceNames));
createMethodVariants(
method, getClientClassName(service), messageTypes, types, resourceNames));
javaMethods.add(createMethodDefaultMethod(method, types));
}
if (method.hasLro()) {
Expand Down 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, signature, types.get(clientName), resourceNames));
method, signature, types.get(clientName), resourceNames, messageTypes));
}
MethodDefinition.Builder methodVariantBuilder =
MethodDefinition.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@

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;
Expand Down Expand Up @@ -185,8 +191,24 @@ public static String composeRpcMethodHeaderSampleCode(
Method method,
List<MethodArgument> arguments,
TypeNode clientType,
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, arguments, clientType, resourceNames, repeatedResponseType));
}
return SampleCodeWriter.write(
composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames));
}
Expand Down Expand Up @@ -289,6 +311,106 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode(
.build();
}

public static TryCatchStatement composeUnaryPagedRpcMethodSampleCode(
Method method,
List<MethodArgument> arguments,
TypeNode clientType,
Map<String, ResourceName> resourceNames,
TypeNode repeatedResponseType) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
// List of rpc method arguments' variable expressions.
List<Expr> 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<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(),
"The method arguments' the number of variable expressions should equal to the number of default value expressions.");
bodyExprs.addAll(
IntStream.range(0, rpcMethodArgVarExprs.size())
.mapToObj(
i ->
AssignmentExpr.builder()
.setVariableExpr(
((VariableExpr) rpcMethodArgVarExprs.get(i))
.toBuilder()
.setIsDecl(true)
.build())
.setValueExpr(rpcMethodArgDefaultValueExprs.get(i))
.build())
.collect(Collectors.toList()));
// 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)
.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(createLineCommentStatement("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===================================================//

// Assign client variable expr with create client.
Expand Down Expand Up @@ -317,4 +439,8 @@ private static boolean isProtoEmptyType(TypeNode type) {
return type.reference().pakkage().equals("com.google.protobuf")
&& type.reference().name().equals("Empty");
}

private static CommentStatement createLineCommentStatement(String content) {
return CommentStatement.withComment(LineComment.withComment(content));
}
}
Loading

0 comments on commit 62854af

Please sign in to comment.