Skip to content

Commit b193f6a

Browse files
[samplecode][3/3]Implement regular paged callable sample code (#638)
1 parent f1fd5fe commit b193f6a

File tree

11 files changed

+817
-41
lines changed

11 files changed

+817
-41
lines changed

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -818,17 +818,13 @@ private static MethodDefinition createCallableMethod(
818818

819819
if (callableMethodKind.equals(CallableMethodKind.REGULAR)
820820
&& method.stream().equals(Stream.NONE)) {
821-
// TODO(summerji): Remove the following if condition after implement paged and lro in
822-
// composeRegularCallableMethodHeaderSampleCode
823-
if (!method.isPaged() && !method.hasLro()) {
824-
sampleCodeOpt =
825-
Optional.of(
826-
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
827-
method,
828-
typeStore.get(ClassNames.getServiceClientClassName(service)),
829-
resourceNames,
830-
messageTypes));
831-
}
821+
sampleCodeOpt =
822+
Optional.of(
823+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
824+
method,
825+
typeStore.get(ClassNames.getServiceClientClassName(service)),
826+
resourceNames,
827+
messageTypes));
832828
}
833829

834830
return MethodDefinition.builder()

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

Lines changed: 177 additions & 25 deletions
Large diffs are not rendered by default.

src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,26 @@ public class EchoClient implements BackgroundResource {
500500
}
501501

502502
// AUTO-GENERATED DOCUMENTATION AND METHOD.
503-
/** Sample code: */
503+
/**
504+
* Sample code:
505+
*
506+
* <pre>{@code
507+
* try (EchoClient echoClient = EchoClient.create()) {
508+
* while (true) {
509+
* PagedExpandResponse response = echoClient.pagedExpandCallable().call(request);
510+
* for (EchoResponse element : response.getResponsesList()) {
511+
* // doThingsWith(element);
512+
* }
513+
* String nextPageToken = response.getNextPageToken();
514+
* if (!Strings.isNullOrEmpty(nextPageToken)) {
515+
* request = request.toBuilder().setPageToken(nextPageToken).build();
516+
* } else {
517+
* break;
518+
* }
519+
* }
520+
* }
521+
* }</pre>
522+
*/
504523
public final UnaryCallable<PagedExpandRequest, PagedExpandResponse> pagedExpandCallable() {
505524
return stub.pagedExpandCallable();
506525
}
@@ -577,7 +596,26 @@ public class EchoClient implements BackgroundResource {
577596
}
578597

579598
// AUTO-GENERATED DOCUMENTATION AND METHOD.
580-
/** Sample code: */
599+
/**
600+
* Sample code:
601+
*
602+
* <pre>{@code
603+
* try (EchoClient echoClient = EchoClient.create()) {
604+
* while (true) {
605+
* PagedExpandResponse response = echoClient.simplePagedExpandCallable().call(request);
606+
* for (EchoResponse element : response.getResponsesList()) {
607+
* // doThingsWith(element);
608+
* }
609+
* String nextPageToken = response.getNextPageToken();
610+
* if (!Strings.isNullOrEmpty(nextPageToken)) {
611+
* request = request.toBuilder().setPageToken(nextPageToken).build();
612+
* } else {
613+
* break;
614+
* }
615+
* }
616+
* }
617+
* }</pre>
618+
*/
581619
public final UnaryCallable<PagedExpandRequest, PagedExpandResponse> simplePagedExpandCallable() {
582620
return stub.simplePagedExpandCallable();
583621
}
@@ -657,7 +695,18 @@ public class EchoClient implements BackgroundResource {
657695
}
658696

659697
// AUTO-GENERATED DOCUMENTATION AND METHOD.
660-
/** Sample code: */
698+
/**
699+
* Sample code:
700+
*
701+
* <pre>{@code
702+
* try (EchoClient echoClient = EchoClient.create()) {
703+
* WaitRequest request = WaitRequest.newBuilder().build();
704+
* ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);
705+
* // Do something.
706+
* Operation response = future.get();
707+
* }
708+
* }</pre>
709+
*/
661710
public final UnaryCallable<WaitRequest, Operation> waitCallable() {
662711
return stub.waitCallable();
663712
}

src/test/java/com/google/api/generator/gapic/composer/goldens/IdentityClient.golden

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,26 @@ public class IdentityClient implements BackgroundResource {
566566
}
567567

568568
// AUTO-GENERATED DOCUMENTATION AND METHOD.
569-
/** Sample code: */
569+
/**
570+
* Sample code:
571+
*
572+
* <pre>{@code
573+
* try (IdentityClient identityClient = IdentityClient.create()) {
574+
* while (true) {
575+
* ListUsersResponse response = identityClient.listUsersCallable().call(request);
576+
* for (User element : response.getResponsesList()) {
577+
* // doThingsWith(element);
578+
* }
579+
* String nextPageToken = response.getNextPageToken();
580+
* if (!Strings.isNullOrEmpty(nextPageToken)) {
581+
* request = request.toBuilder().setPageToken(nextPageToken).build();
582+
* } else {
583+
* break;
584+
* }
585+
* }
586+
* }
587+
* }</pre>
588+
*/
570589
public final UnaryCallable<ListUsersRequest, ListUsersResponse> listUsersCallable() {
571590
return stub.listUsersCallable();
572591
}

src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java

Lines changed: 249 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1684,7 +1684,7 @@ public void invalidComposePagedCallableMethodHeaderSampleCode_noRepeatedResponse
16841684
method, clientType, resourceNames, messageTypes));
16851685
}
16861686

1687-
// ==============================Server Stream Callable Method Sample Code ====================//
1687+
// ==============================Stream Callable Method Sample Code ====================//
16881688
@Test
16891689
public void validComposeStreamCallableMethodHeaderSampleCode_serverStream() {
16901690
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
@@ -2008,6 +2008,167 @@ public void validComposeRegularCallableMethodHeaderSampleCode_unaryRpc() {
20082008
assertEquals(results, expected);
20092009
}
20102010

2011+
@Test
2012+
public void validComposeRegularCallableMethodHeaderSampleCode_lroRpc() {
2013+
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
2014+
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
2015+
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
2016+
TypeNode clientType =
2017+
TypeNode.withReference(
2018+
VaporReference.builder()
2019+
.setName("EchoClient")
2020+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2021+
.build());
2022+
TypeNode inputType =
2023+
TypeNode.withReference(
2024+
VaporReference.builder()
2025+
.setName("WaitRequest")
2026+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2027+
.build());
2028+
TypeNode outputType =
2029+
TypeNode.withReference(
2030+
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
2031+
TypeNode responseType =
2032+
TypeNode.withReference(
2033+
VaporReference.builder()
2034+
.setName("WaitResponse")
2035+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2036+
.build());
2037+
TypeNode metadataType =
2038+
TypeNode.withReference(
2039+
VaporReference.builder()
2040+
.setName("WaitMetadata")
2041+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2042+
.build());
2043+
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
2044+
Method method =
2045+
Method.builder()
2046+
.setName("Wait")
2047+
.setInputType(inputType)
2048+
.setOutputType(outputType)
2049+
.setLro(lro)
2050+
.build();
2051+
String results =
2052+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
2053+
method, clientType, resourceNames, messageTypes);
2054+
String expected =
2055+
LineFormatter.lines(
2056+
"try (EchoClient echoClient = EchoClient.create()) {\n",
2057+
" WaitRequest request = WaitRequest.newBuilder().build();\n",
2058+
" ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);\n",
2059+
" // Do something.\n",
2060+
" Operation response = future.get();\n",
2061+
"}");
2062+
assertEquals(results, expected);
2063+
}
2064+
2065+
@Test
2066+
public void validComposeRegularCallableMethodHeaderSampleCode_lroRpcWithReturnVoid() {
2067+
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
2068+
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
2069+
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
2070+
TypeNode clientType =
2071+
TypeNode.withReference(
2072+
VaporReference.builder()
2073+
.setName("EchoClient")
2074+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2075+
.build());
2076+
TypeNode inputType =
2077+
TypeNode.withReference(
2078+
VaporReference.builder()
2079+
.setName("WaitRequest")
2080+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2081+
.build());
2082+
TypeNode outputType =
2083+
TypeNode.withReference(
2084+
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
2085+
TypeNode responseType =
2086+
TypeNode.withReference(
2087+
VaporReference.builder()
2088+
.setName("Empty")
2089+
.setPakkage(PROTO_PACKAGE_NAME)
2090+
.build());
2091+
TypeNode metadataType =
2092+
TypeNode.withReference(
2093+
VaporReference.builder()
2094+
.setName("WaitMetadata")
2095+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2096+
.build());
2097+
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
2098+
Method method =
2099+
Method.builder()
2100+
.setName("Wait")
2101+
.setInputType(inputType)
2102+
.setOutputType(outputType)
2103+
.setLro(lro)
2104+
.build();
2105+
String results =
2106+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
2107+
method, clientType, resourceNames, messageTypes);
2108+
String expected =
2109+
LineFormatter.lines(
2110+
"try (EchoClient echoClient = EchoClient.create()) {\n",
2111+
" WaitRequest request = WaitRequest.newBuilder().build();\n",
2112+
" ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);\n",
2113+
" // Do something.\n",
2114+
" future.get();\n",
2115+
"}");
2116+
assertEquals(results, expected);
2117+
}
2118+
2119+
@Test
2120+
public void validComposeRegularCallableMethodHeaderSampleCode_pageRpc() {
2121+
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
2122+
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
2123+
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
2124+
TypeNode clientType =
2125+
TypeNode.withReference(
2126+
VaporReference.builder()
2127+
.setName("EchoClient")
2128+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2129+
.build());
2130+
TypeNode inputType =
2131+
TypeNode.withReference(
2132+
VaporReference.builder()
2133+
.setName("PagedExpandRequest")
2134+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2135+
.build());
2136+
TypeNode outputType =
2137+
TypeNode.withReference(
2138+
VaporReference.builder()
2139+
.setName("PagedExpandResponse")
2140+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2141+
.build());
2142+
Method method =
2143+
Method.builder()
2144+
.setName("PagedExpand")
2145+
.setInputType(inputType)
2146+
.setOutputType(outputType)
2147+
.setMethodSignatures(Collections.emptyList())
2148+
.setIsPaged(true)
2149+
.build();
2150+
String results =
2151+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
2152+
method, clientType, resourceNames, messageTypes);
2153+
String expected =
2154+
LineFormatter.lines(
2155+
"try (EchoClient echoClient = EchoClient.create()) {\n",
2156+
" while (true) {\n",
2157+
" PagedExpandResponse response = echoClient.pagedExpandCallable().call(request);\n",
2158+
" for (EchoResponse element : response.getResponsesList()) {\n",
2159+
" // doThingsWith(element);\n",
2160+
" }\n",
2161+
" String nextPageToken = response.getNextPageToken();\n",
2162+
" if (!Strings.isNullOrEmpty(nextPageToken)) {\n",
2163+
" request = request.toBuilder().setPageToken(nextPageToken).build();\n",
2164+
" } else {\n",
2165+
" break;\n",
2166+
" }\n",
2167+
" }\n",
2168+
"}");
2169+
assertEquals(results, expected);
2170+
}
2171+
20112172
@Test
20122173
public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodRequest() {
20132174
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
@@ -2043,4 +2204,91 @@ public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodReq
20432204
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
20442205
method, clientType, resourceNames, messageTypes));
20452206
}
2207+
2208+
@Test
2209+
public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodResponsePagedRpc() {
2210+
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
2211+
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
2212+
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
2213+
TypeNode clientType =
2214+
TypeNode.withReference(
2215+
VaporReference.builder()
2216+
.setName("EchoClient")
2217+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2218+
.build());
2219+
TypeNode inputType =
2220+
TypeNode.withReference(
2221+
VaporReference.builder()
2222+
.setName("EchoRequest")
2223+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2224+
.build());
2225+
TypeNode outputType =
2226+
TypeNode.withReference(
2227+
VaporReference.builder()
2228+
.setName("NoExistResponse")
2229+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2230+
.build());
2231+
Method method =
2232+
Method.builder()
2233+
.setName("PagedExpand")
2234+
.setInputType(inputType)
2235+
.setOutputType(outputType)
2236+
.setIsPaged(true)
2237+
.build();
2238+
assertThrows(
2239+
NullPointerException.class,
2240+
() ->
2241+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
2242+
method, clientType, resourceNames, messageTypes));
2243+
}
2244+
2245+
@Test
2246+
public void invalidComposeRegularCallableMethodHeaderSampleCode_noRepeatedResponsePagedRpc() {
2247+
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
2248+
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
2249+
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
2250+
TypeNode clientType =
2251+
TypeNode.withReference(
2252+
VaporReference.builder()
2253+
.setName("EchoClient")
2254+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2255+
.build());
2256+
TypeNode inputType =
2257+
TypeNode.withReference(
2258+
VaporReference.builder()
2259+
.setName("EchoRequest")
2260+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2261+
.build());
2262+
TypeNode outputType =
2263+
TypeNode.withReference(
2264+
VaporReference.builder()
2265+
.setName("NoRepeatedResponse")
2266+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2267+
.build());
2268+
Method method =
2269+
Method.builder()
2270+
.setName("PagedExpand")
2271+
.setInputType(inputType)
2272+
.setOutputType(outputType)
2273+
.setIsPaged(true)
2274+
.build();
2275+
Field responseField = Field.builder().setName("response").setType(TypeNode.STRING).build();
2276+
Message noRepeatedResponseMessage =
2277+
Message.builder()
2278+
.setName("NoRepeatedResponse")
2279+
.setType(
2280+
TypeNode.withReference(
2281+
VaporReference.builder()
2282+
.setName("NoRepeatedResponse")
2283+
.setPakkage(SHOWCASE_PACKAGE_NAME)
2284+
.build()))
2285+
.setFields(Arrays.asList(responseField))
2286+
.build();
2287+
messageTypes.put("NoRepeatedResponse", noRepeatedResponseMessage);
2288+
assertThrows(
2289+
NullPointerException.class,
2290+
() ->
2291+
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
2292+
method, clientType, resourceNames, messageTypes));
2293+
}
20462294
}

0 commit comments

Comments
 (0)