From bb041179f92f5947a1c31ca6b2ca864288d8d40f Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Thu, 10 Sep 2020 13:07:15 -0700 Subject: [PATCH 1/8] add pagedCallable getter --- .../composer/ServiceClientClassComposer.java | 57 ++++++++++++++++--- .../ServiceClientClassComposerTest.java | 5 ++ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index c3893fee8d..5d5b3b64c5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -73,6 +73,8 @@ public class ServiceClientClassComposer implements ClassComposer { private static final ServiceClientClassComposer INSTANCE = new ServiceClientClassComposer(); + private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; + private static final String CLIENT_CLASS_NAME_PATTERN = "%sClient"; private ServiceClientClassComposer() {} @@ -425,6 +427,9 @@ private static List createServiceMethods( javaMethods.add(createLroAsyncMethod(service.name(), method, types)); javaMethods.add(createLroCallable(service.name(), method, types)); } + if (method.isPaged()) { + javaMethods.add(createPagedCallableMethod(service.name(), method, types)); + } javaMethods.add(createCallableMethod(service.name(), method, types)); } return javaMethods; @@ -622,16 +627,25 @@ private static MethodDefinition createLroAsyncMethod( private static MethodDefinition createLroCallable( String serviceName, Method method, Map types) { - return createCallableMethod(serviceName, method, types, true); + return createCallableMethod(serviceName, method, types, true, false); } private static MethodDefinition createCallableMethod( String serviceName, Method method, Map types) { - return createCallableMethod(serviceName, method, types, false); + return createCallableMethod(serviceName, method, types, false, false); + } + + private static MethodDefinition createPagedCallableMethod( + String serviceName, Method method, Map types) { + return createCallableMethod(serviceName, method, types, false, true); } private static MethodDefinition createCallableMethod( - String serviceName, Method method, Map types, boolean isLroCallable) { + String serviceName, + Method method, + Map types, + boolean isLroCallable, + boolean isPaged) { TypeNode rawCallableReturnType = null; if (isLroCallable) { rawCallableReturnType = types.get("OperationCallable"); @@ -652,7 +666,6 @@ private static MethodDefinition createCallableMethod( rawCallableReturnType = types.get("UnaryCallable"); } } - // Set generics. TypeNode returnType = TypeNode.withReference( @@ -664,14 +677,24 @@ private static MethodDefinition createCallableMethod( method.inputType().reference(), method.lro().responseType().reference(), method.lro().metadataType().reference()) - : Arrays.asList( - method.inputType().reference(), method.outputType().reference()))); + : isPaged + ? Arrays.asList( + method.inputType().reference(), + types + .get( + String.format( + PAGED_RESPONSE_TYPE_NAME_PATTERN, method.name())) + .reference()) + : Arrays.asList( + method.inputType().reference(), method.outputType().reference()))); String rawMethodName = JavaStyle.toLowerCamelCase(method.name()); String methodName = isLroCallable ? String.format("%sOperationCallabke", rawMethodName) - : String.format("%sCallable", rawMethodName); + : isPaged + ? String.format("%sPagedCallable", rawMethodName) + : String.format("%sCallable", rawMethodName); TypeNode stubType = types.get(String.format("%sStub", serviceName)); MethodInvocationExpr returnExpr = MethodInvocationExpr.builder() @@ -884,6 +907,21 @@ private static Map createVaporTypes(Service service) { .setName("OperationsClient") .setPakkage("com.google.longrunning") .build())); + // Pagination types. + types.putAll( + service.methods().stream() + .filter(m -> m.isPaged()) + .collect( + Collectors.toMap( + m -> String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name()), + m -> + TypeNode.withReference( + VaporReference.builder() + .setName(String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, m.name())) + .setPakkage(service.pakkage()) + .setEnclosingClassName(getClientClassName(service.name())) + .setIsStaticImport(true) + .build())))); return types; } @@ -905,4 +943,9 @@ private static Map createProtoMessageTypes( private static Variable createVariable(String name, TypeNode type) { return Variable.builder().setName(name).setType(type).build(); } + + private static String getClientClassName(String serviceName) { + + return String.format(CLIENT_CLASS_NAME_PATTERN, serviceName); + } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index c5df016a51..4650e30460 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -205,6 +205,11 @@ public void generateServiceClasses() { + " return pagedExpandCallable().call(request);\n" + " }\n" + "\n" + + " public final UnaryCallable\n" + + " pagedExpandPagedCallable() {\n" + + " return stub.pagedExpandPagedCallable();\n" + + " }\n" + + "\n" + " public final UnaryCallable" + " pagedExpandCallable() {\n" + " return stub.pagedExpandCallable();\n" From a97ed5f4d4ed5dc7a7e749f964d353719e3463e0 Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Thu, 10 Sep 2020 14:28:29 -0700 Subject: [PATCH 2/8] fix --- .../composer/ServiceClientClassComposer.java | 15 +++++++++------ .../composer/ServiceClientClassComposerTest.java | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 5d5b3b64c5..008905b06b 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -74,7 +74,9 @@ public class ServiceClientClassComposer implements ClassComposer { private static final ServiceClientClassComposer INSTANCE = new ServiceClientClassComposer(); private static final String PAGED_RESPONSE_TYPE_NAME_PATTERN = "%sPagedResponse"; - private static final String CLIENT_CLASS_NAME_PATTERN = "%sClient"; + private static final String CALLABLE_NAME_PATTERN = "%sCallable"; + private static final String PAGED_CALLABLE_NAME_PATTERN = "%sPagedCallable"; + private static final String OPERATION_CALLABLE_NAME_PATTERN = "%sOperationCallable"; private ServiceClientClassComposer() {} @@ -558,7 +560,7 @@ private static List createMethodVariants( MethodInvocationExpr methodReturnExpr = MethodInvocationExpr.builder() - .setMethodName(String.format("%sCallable", methodName)) + .setMethodName(String.format(CALLABLE_NAME_PATTERN, methodName)) .build(); methodReturnExpr = MethodInvocationExpr.builder() @@ -666,6 +668,7 @@ private static MethodDefinition createCallableMethod( rawCallableReturnType = types.get("UnaryCallable"); } } + // Set generics. TypeNode returnType = TypeNode.withReference( @@ -691,10 +694,10 @@ private static MethodDefinition createCallableMethod( String rawMethodName = JavaStyle.toLowerCamelCase(method.name()); String methodName = isLroCallable - ? String.format("%sOperationCallabke", rawMethodName) + ? String.format(OPERATION_CALLABLE_NAME_PATTERN, rawMethodName) : isPaged - ? String.format("%sPagedCallable", rawMethodName) - : String.format("%sCallable", rawMethodName); + ? String.format(PAGED_CALLABLE_NAME_PATTERN, rawMethodName) + : String.format(CALLABLE_NAME_PATTERN, rawMethodName); TypeNode stubType = types.get(String.format("%sStub", serviceName)); MethodInvocationExpr returnExpr = MethodInvocationExpr.builder() @@ -946,6 +949,6 @@ private static Variable createVariable(String name, TypeNode type) { private static String getClientClassName(String serviceName) { - return String.format(CLIENT_CLASS_NAME_PATTERN, serviceName); + return String.format("%sClient", serviceName); } } diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 4650e30460..1b4706123b 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -221,8 +221,8 @@ public void generateServiceClasses() { + " }\n" + "\n" + " public final OperationCallable" - + " waitOperationCallabke() {\n" - + " return stub.waitOperationCallabke();\n" + + " waitOperationCallable() {\n" + + " return stub.waitOperationCallable();\n" + " }\n" + "\n" + " public final UnaryCallable waitCallable() {\n" From 7c3e752c3b0f05f418ce6f2a3ae5ea77232205ee Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Thu, 10 Sep 2020 14:49:45 -0700 Subject: [PATCH 3/8] update service client method --- .../gapic/composer/ServiceClientClassComposer.java | 14 +++++++++----- .../composer/ServiceClientClassComposerTest.java | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 008905b06b..5b7baad1f9 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -442,7 +442,10 @@ private static List createMethodVariants( List javaMethods = new ArrayList<>(); String methodName = JavaStyle.toLowerCamelCase(method.name()); TypeNode methodInputType = method.inputType(); - TypeNode methodOutputType = method.outputType(); + TypeNode methodOutputType = + method.isPaged() + ? types.get(String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, method.name())) + : method.outputType(); String methodInputTypeName = methodInputType.reference().name(); Message inputMessage = messageTypes.get(methodInputTypeName); @@ -557,11 +560,12 @@ private static List createMethodVariants( .setVariable(Variable.builder().setName("request").setType(methodInputType).build()) .setIsDecl(true) .build(); - + String callableMethodName = + method.isPaged() + ? String.format(PAGED_CALLABLE_NAME_PATTERN, methodName) + : String.format(CALLABLE_NAME_PATTERN, methodName); MethodInvocationExpr methodReturnExpr = - MethodInvocationExpr.builder() - .setMethodName(String.format(CALLABLE_NAME_PATTERN, methodName)) - .build(); + MethodInvocationExpr.builder().setMethodName(callableMethodName).build(); methodReturnExpr = MethodInvocationExpr.builder() .setMethodName("call") diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 1b4706123b..218a6e44b7 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -201,8 +201,8 @@ public void generateServiceClasses() { + " return stub.chatAgainCallable();\n" + " }\n" + "\n" - + " public final PagedExpandResponse pagedExpand(PagedExpandRequest request) {\n" - + " return pagedExpandCallable().call(request);\n" + + " public final PagedExpandPagedResponse pagedExpand(PagedExpandRequest request) {\n" + + " return pagedExpandPagedCallable().call(request);\n" + " }\n" + "\n" + " public final UnaryCallable\n" From a916dc94a4297884c6c114e023464b2d1533b1df Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Thu, 10 Sep 2020 20:44:31 -0700 Subject: [PATCH 4/8] feedback --- .../composer/ServiceClientClassComposer.java | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 008905b06b..95bf8ebbd5 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -36,6 +36,7 @@ import com.google.api.generator.engine.ast.MethodInvocationExpr; import com.google.api.generator.engine.ast.NewObjectExpr; import com.google.api.generator.engine.ast.NullObjectValue; +import com.google.api.generator.engine.ast.Reference; import com.google.api.generator.engine.ast.ScopeNode; import com.google.api.generator.engine.ast.Statement; import com.google.api.generator.engine.ast.TernaryExpr; @@ -78,6 +79,12 @@ public class ServiceClientClassComposer implements ClassComposer { private static final String PAGED_CALLABLE_NAME_PATTERN = "%sPagedCallable"; private static final String OPERATION_CALLABLE_NAME_PATTERN = "%sOperationCallable"; + enum CallableMethodKind { + REGULAR, + LRO, + PAGED, + } + private ServiceClientClassComposer() {} public static ServiceClientClassComposer instance() { @@ -629,27 +636,26 @@ private static MethodDefinition createLroAsyncMethod( private static MethodDefinition createLroCallable( String serviceName, Method method, Map types) { - return createCallableMethod(serviceName, method, types, true, false); + return createCallableMethod(serviceName, method, types, CallableMethodKind.LRO); } private static MethodDefinition createCallableMethod( String serviceName, Method method, Map types) { - return createCallableMethod(serviceName, method, types, false, false); + return createCallableMethod(serviceName, method, types, CallableMethodKind.REGULAR); } private static MethodDefinition createPagedCallableMethod( String serviceName, Method method, Map types) { - return createCallableMethod(serviceName, method, types, false, true); + return createCallableMethod(serviceName, method, types, CallableMethodKind.PAGED); } private static MethodDefinition createCallableMethod( String serviceName, Method method, Map types, - boolean isLroCallable, - boolean isPaged) { + CallableMethodKind callableMethodKind) { TypeNode rawCallableReturnType = null; - if (isLroCallable) { + if (callableMethodKind.equals(CallableMethodKind.LRO)) { rawCallableReturnType = types.get("OperationCallable"); } else { switch (method.stream()) { @@ -674,30 +680,10 @@ private static MethodDefinition createCallableMethod( TypeNode.withReference( rawCallableReturnType .reference() - .copyAndSetGenerics( - isLroCallable - ? Arrays.asList( - method.inputType().reference(), - method.lro().responseType().reference(), - method.lro().metadataType().reference()) - : isPaged - ? Arrays.asList( - method.inputType().reference(), - types - .get( - String.format( - PAGED_RESPONSE_TYPE_NAME_PATTERN, method.name())) - .reference()) - : Arrays.asList( - method.inputType().reference(), method.outputType().reference()))); + .copyAndSetGenerics(getGenericsFromCallable(callableMethodKind, method, types))); String rawMethodName = JavaStyle.toLowerCamelCase(method.name()); - String methodName = - isLroCallable - ? String.format(OPERATION_CALLABLE_NAME_PATTERN, rawMethodName) - : isPaged - ? String.format(PAGED_CALLABLE_NAME_PATTERN, rawMethodName) - : String.format(CALLABLE_NAME_PATTERN, rawMethodName); + String methodName = getCallableName(callableMethodKind, rawMethodName); TypeNode stubType = types.get(String.format("%sStub", serviceName)); MethodInvocationExpr returnExpr = MethodInvocationExpr.builder() @@ -948,7 +934,32 @@ private static Variable createVariable(String name, TypeNode type) { } private static String getClientClassName(String serviceName) { - return String.format("%sClient", serviceName); } + + private static List getGenericsFromCallable( + CallableMethodKind kind, Method method, Map types) { + if (kind.equals(CallableMethodKind.LRO)) { + return Arrays.asList( + method.inputType().reference(), + method.lro().responseType().reference(), + method.lro().metadataType().reference()); + } + if (kind.equals(CallableMethodKind.PAGED)) { + return Arrays.asList( + method.inputType().reference(), + types.get(String.format(PAGED_RESPONSE_TYPE_NAME_PATTERN, method.name())).reference()); + } + return Arrays.asList(method.inputType().reference(), method.outputType().reference()); + } + + private static String getCallableName(CallableMethodKind kind, String rawMethodName) { + if (kind.equals(CallableMethodKind.LRO)) { + return String.format(OPERATION_CALLABLE_NAME_PATTERN, rawMethodName); + } + if (kind.equals(CallableMethodKind.PAGED)) { + return String.format(PAGED_CALLABLE_NAME_PATTERN, rawMethodName); + } + return String.format(CALLABLE_NAME_PATTERN, rawMethodName); + } } From 6fe8222c0013e94b28fee18f34fbc3e2f765e3ef Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Thu, 10 Sep 2020 22:47:49 -0700 Subject: [PATCH 5/8] feedback --- .../generator/gapic/composer/ServiceClientClassComposer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 95bf8ebbd5..0b200f56ef 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -680,7 +680,7 @@ private static MethodDefinition createCallableMethod( TypeNode.withReference( rawCallableReturnType .reference() - .copyAndSetGenerics(getGenericsFromCallable(callableMethodKind, method, types))); + .copyAndSetGenerics(getGenericsForCallable(callableMethodKind, method, types))); String rawMethodName = JavaStyle.toLowerCamelCase(method.name()); String methodName = getCallableName(callableMethodKind, rawMethodName); @@ -937,7 +937,7 @@ private static String getClientClassName(String serviceName) { return String.format("%sClient", serviceName); } - private static List getGenericsFromCallable( + private static List getGenericsForCallable( CallableMethodKind kind, Method method, Map types) { if (kind.equals(CallableMethodKind.LRO)) { return Arrays.asList( From 1733032b0c3f8eb19e92f7a94a156531a692296d Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Fri, 11 Sep 2020 20:00:39 -0700 Subject: [PATCH 6/8] enum --- .../generator/gapic/composer/ServiceClientClassComposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java index 0b200f56ef..07acdcd4cc 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java @@ -79,7 +79,7 @@ public class ServiceClientClassComposer implements ClassComposer { private static final String PAGED_CALLABLE_NAME_PATTERN = "%sPagedCallable"; private static final String OPERATION_CALLABLE_NAME_PATTERN = "%sOperationCallable"; - enum CallableMethodKind { + private enum CallableMethodKind { REGULAR, LRO, PAGED, From a13e009d8ac6476873e3e88fcf5f1f608754f43d Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Fri, 11 Sep 2020 20:23:40 -0700 Subject: [PATCH 7/8] format --- BUILD.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 9ffa59e6cb..ca61266dfd 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,11 +1,11 @@ -package(default_visibility = ["//visibility:public"]) - load( "//:gapic_generator_java.bzl", "google_java_format", "google_java_format_verification", ) +package(default_visibility = ["//visibility:public"]) + JAVA_SRCS = [ "//src/main/java/com/google/api/generator:generator_files", "//src/main/java/com/google/api/generator/engine:engine_files", From a0b84e49b3f205ceed42791b7323910935bd0e7d Mon Sep 17 00:00:00 2001 From: xiaozhenliugg Date: Fri, 11 Sep 2020 20:25:18 -0700 Subject: [PATCH 8/8] clean up --- .../gapic/composer/ServiceClientClassComposerTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java index 20602ebc3a..f46191705a 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/ServiceClientClassComposerTest.java @@ -57,9 +57,6 @@ public void generateServiceClasses() { JavaWriterVisitor visitor = new JavaWriterVisitor(); clazz.classDefinition().accept(visitor); - System.out.println(visitor.write()); - System.out.println(EXPECTED_CLASS_STRING); - assertEquals(EXPECTED_CLASS_STRING, visitor.write()); }