Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
refactor assignment expr of default value on method arguments
  • Loading branch information
summer-ji-eng committed Dec 9, 2020
commit 4735c407063da67ce371ba7d55b8d0952f54cbe1
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -479,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 All @@ -499,9 +500,9 @@ private static List<MethodDefinition> createServiceMethods(

private static List<MethodDefinition> createMethodVariants(
Method method,
String clientName,
Map<String, Message> messageTypes,
Map<String, TypeNode> types,
String clientName,
Map<String, ResourceName> resourceNames) {
List<MethodDefinition> javaMethods = new ArrayList<>();
String methodName = JavaStyle.toLowerCamelCase(method.name());
Expand Down Expand Up @@ -564,13 +565,14 @@ private static List<MethodDefinition> createMethodVariants(
.setReturnType(methodOutputType)
.build();

String methodSampleCode = "";
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.
methodSampleCode =
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, signature, types.get(clientName), resourceNames);
Optional.of(
ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
method, signature, types.get(clientName), resourceNames));
}
MethodDefinition.Builder methodVariantBuilder =
MethodDefinition.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -162,17 +163,17 @@ static CommentStatement createCreateMethodStubArgComment(
}

static List<CommentStatement> createRpcMethodHeaderComment(
Method method, List<MethodArgument> methodArguments, String sampleCode) {
Method method, List<MethodArgument> methodArguments, Optional<String> sampleCode) {
JavaDocComment.Builder methodJavadocBuilder = JavaDocComment.builder();

if (method.hasDescription()) {
methodJavadocBuilder =
processProtobufComment(method.description(), methodJavadocBuilder, null);
}

if (!Strings.isNullOrEmpty(sampleCode)) {
if (sampleCode.isPresent()) {
methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING);
methodJavadocBuilder.addSampleCode(sampleCode);
methodJavadocBuilder.addSampleCode(sampleCode.get());
}

if (methodArguments.isEmpty()) {
Expand All @@ -199,7 +200,7 @@ static List<CommentStatement> createRpcMethodHeaderComment(

static List<CommentStatement> createRpcMethodHeaderComment(Method method) {
// TODO(summerji): Refactor this method when implement default method sample code.
return createRpcMethodHeaderComment(method, Collections.emptyList(), "");
return createRpcMethodHeaderComment(method, Collections.emptyList(), Optional.empty());
}

static CommentStatement createMethodNoArgComment(String serviceName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,15 @@
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.base.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ServiceClientSampleCodeComposer {
// TODO(summerji): Add unit tests for ServiceClientSampleCodeComposer.

public static String composeClassHeaderCredentialsSampleCode(
// TODO(summerji): Add unit tests for composeClassHeaderCredentialsSampleCode.
Expand Down Expand Up @@ -185,7 +186,7 @@ public static String composeRpcMethodHeaderSampleCode(
List<MethodArgument> arguments,
TypeNode clientType,
Map<String, ResourceName> resourceNames) {
// TODO(summerji): Add Other types RPC methods' sample code.
// TODO(summerji): Add other types RPC methods' sample code.
return SampleCodeWriter.write(
composeUnaryRpcMethodSampleCode(method, arguments, clientType, resourceNames));
}
Expand All @@ -201,38 +202,88 @@ public static TryCatchStatement composeUnaryRpcMethodSampleCode(
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
// Assign each method arguments with its default value.
List<Expr> methodArgExprs = createMethodArgVarExprs(arguments, resourceNames);
List<Expr> bodyExpr =
assignMethodArgumentsWithDefaultValues(arguments, methodArgExprs, resourceNames);
// 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(), "Error message here");
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()));
// 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(...);
boolean returnsVoid = isProtoEmptyType(method.outputType());
if (returnsVoid) {
bodyExpr.add(
bodyExprs.add(
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(JavaStyle.toLowerCamelCase(method.name()))
.setArguments(methodArgExprs)
.setArguments(rpcMethodArgVarExprs)
.setReturnType(clientType)
.build());
} else {
VariableExpr responseVarExpr =
VariableExpr.withVariable(
Variable.builder().setName(RESPONSE).setType(method.outputType()).build());
bodyExpr.add(
createAssignExprForVariableWithClientMethod(
responseVarExpr,
clientVarExpr,
JavaStyle.toLowerCamelCase(method.name()),
methodArgExprs));
Variable.builder().setName("response").setType(method.outputType()).build());
MethodInvocationExpr clientMethodInvocationExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(JavaStyle.toLowerCamelCase(method.name()))
.setArguments(rpcMethodArgVarExprs)
.setReturnType(responseVarExpr.variable().type())
.build();
bodyExprs.add(
AssignmentExpr.builder()
.setVariableExpr(responseVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(clientMethodInvocationExpr)
.build());
}

return TryCatchStatement.builder()
.setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
.setTryBody(
bodyExpr.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()))
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()))
.setIsSampleCode(true)
.build();
}
Expand All @@ -255,7 +306,7 @@ private static AssignmentExpr assignClientVariableWithCreateMethodExpr(
}

// Create a list of Expr for method argument variable expression.
private static List<Expr> createMethodArgVarExprs(
private static List<Expr> createRpcMethodArgVarExprs(
List<MethodArgument> arguments, Map<String, ResourceName> resourceNames) {
return arguments.stream()
.map(
Expand All @@ -280,64 +331,11 @@ private static List<Expr> createMethodArgVarExprs(
.collect(Collectors.toList());
}

// Return a list of AssignmentExpr for method argument with its default value.
private static List<Expr> assignMethodArgumentsWithDefaultValues(
List<MethodArgument> arguments,
List<Expr> argVarExprs,
Map<String, ResourceName> resourceNames) {
List<ResourceName> resourceNameList =
resourceNames.values().stream().collect(Collectors.toList());
List<Expr> assignmentExprs = new ArrayList<>();
for (int i = 0; i < arguments.size(); i++) {
MethodArgument arg = arguments.get(i);
VariableExpr argVarExpr =
(argVarExprs.get(i) instanceof VariableExpr) ? (VariableExpr) argVarExprs.get(i) : null;
Expr defaultValueExpr = DefaultValueComposer.createDefaultValue(arg, resourceNames);
if (arg.type().equals(TypeNode.STRING)
&& arg.field().hasResourceReference()
&& resourceNames.containsKey(arg.field().resourceReference().resourceTypeString())) {
ResourceName resourceName =
resourceNames.get(arg.field().resourceReference().resourceTypeString());
defaultValueExpr =
DefaultValueComposer.createDefaultValue(
resourceName, resourceNameList, arg.field().name());
TypeNode resourceReferenceType =
arg.field().resourceReference().isChildType()
? TypeNode.withReference(
ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class))
: defaultValueExpr.type();
argVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(arg.name()))
.setType(resourceReferenceType)
.build());
}
assignmentExprs.add(
AssignmentExpr.builder()
.setVariableExpr(argVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(defaultValueExpr)
.build());
}
return assignmentExprs;
}

private static Expr createAssignExprForVariableWithClientMethod(
VariableExpr variableExpr,
VariableExpr clientVarExpr,
String methodName,
List<Expr> argumentsVarExprs) {
MethodInvocationExpr clientMethodInvocationExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(JavaStyle.toLowerCamelCase(methodName))
.setArguments(argumentsVarExprs)
.setReturnType(variableExpr.variable().type())
.build();
return AssignmentExpr.builder()
.setVariableExpr(variableExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(clientMethodInvocationExpr)
.build();
private static boolean isStringTypedResourceName(
MethodArgument arg, Map<String, ResourceName> resourceNames) {
return arg.type().equals(TypeNode.STRING)
&& arg.field().hasResourceReference()
&& resourceNames.containsKey(arg.field().resourceReference().resourceTypeString());
}

private static boolean isProtoEmptyType(TypeNode type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,8 @@ public void composeUnaryRpcMethodSampleCode_stringWithResourceReferenceMethodArg
unaryMethod, signatures.get(0), clientType, resourceNames));
String expected =
"try (EchoClient echoClient = EchoClient.create()) {\n"
+ " FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n"
+ " EchoResponse response = echoClient.echo(name.toString());\n"
+ " String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n"
+ " EchoResponse response = echoClient.echo(name);\n"
+ "}";
assertEquals(expected, results);
}
Expand Down Expand Up @@ -219,8 +219,8 @@ public void composeUnaryRpcMethodSampleCode_stringWithParentResourceReferenceMet
unaryMethod, signatures.get(0), clientType, resourceNames));
String expected =
"try (EchoClient echoClient = EchoClient.create()) {\n"
+ " ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n"
+ " EchoResponse response = echoClient.echo(parent.toString());\n"
+ " String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n"
+ " EchoResponse response = echoClient.echo(parent);\n"
+ "}";
assertEquals(expected, results);
}
Expand Down Expand Up @@ -320,9 +320,9 @@ public void composeUnaryRpcMethodSampleCode_multipleWordNameMethodArgument() {
unaryMethod, signatures.get(0), clientType, resourceNames));
String expected =
"try (EchoClient echoClient = EchoClient.create()) {\n"
+ " ResourceName displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n"
+ " String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\").toString();\n"
+ " String otherName = \"other_name-182411686\";\n"
+ " EchoResponse response = echoClient.echo(displayName.toString(), otherName);\n"
+ " EchoResponse response = echoClient.echo(displayName, otherName);\n"
+ "}";
assertEquals(expected, results);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,8 @@ public class EchoClient implements BackgroundResource {
*
* <pre>{@code
* try (EchoClient echoClient = EchoClient.create()) {
* FoobarName name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
* EchoResponse response = echoClient.echo(name.toString());
* String name = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
* EchoResponse response = echoClient.echo(name);
* }
* }</pre>
*
Expand All @@ -263,8 +263,8 @@ public class EchoClient implements BackgroundResource {
*
* <pre>{@code
* try (EchoClient echoClient = EchoClient.create()) {
* ResourceName parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]");
* EchoResponse response = echoClient.echo(parent.toString());
* String parent = FoobarName.ofProjectFoobarName("[PROJECT]", "[FOOBAR]").toString();
* EchoResponse response = echoClient.echo(parent);
* }
* }</pre>
*
Expand Down
Loading