|
20 | 20 | import com.google.api.core.BetaApi;
|
21 | 21 | import com.google.api.gax.core.BackgroundResource;
|
22 | 22 | import com.google.api.gax.longrunning.OperationFuture;
|
| 23 | +import com.google.api.gax.paging.AbstractPage; |
23 | 24 | import com.google.api.gax.paging.AbstractPagedListResponse;
|
24 | 25 | import com.google.api.gax.rpc.BidiStreamingCallable;
|
25 | 26 | import com.google.api.gax.rpc.ClientStreamingCallable;
|
|
43 | 44 | import com.google.api.generator.engine.ast.ReferenceConstructorExpr;
|
44 | 45 | import com.google.api.generator.engine.ast.ScopeNode;
|
45 | 46 | import com.google.api.generator.engine.ast.Statement;
|
| 47 | +import com.google.api.generator.engine.ast.SuperObjectValue; |
46 | 48 | import com.google.api.generator.engine.ast.TernaryExpr;
|
47 | 49 | import com.google.api.generator.engine.ast.ThisObjectValue;
|
48 | 50 | import com.google.api.generator.engine.ast.TypeNode;
|
|
75 | 77 | import java.util.Map;
|
76 | 78 | import java.util.Objects;
|
77 | 79 | import java.util.concurrent.TimeUnit;
|
| 80 | +import java.util.function.Function; |
78 | 81 | import java.util.stream.Collectors;
|
79 | 82 | import javax.annotation.Generated;
|
80 | 83 |
|
@@ -892,37 +895,43 @@ private static List<ClassDefinition> createNestedPagingClasses(
|
892 | 895 | if (!method.isPaged()) {
|
893 | 896 | continue;
|
894 | 897 | }
|
895 |
| - nestedClasses.add(createNestedRpcPagedResponseClass(method, messageTypes, types)); |
| 898 | + // Find the repeated field. |
| 899 | + Message methodOutputMessage = messageTypes.get(method.outputType().reference().name()); |
| 900 | + TypeNode repeatedResponseType = null; |
| 901 | + for (Field field : methodOutputMessage.fields()) { |
| 902 | + if (field.isRepeated() && !field.isMap()) { |
| 903 | + Reference repeatedGenericRef = field.type().reference().generics().get(0); |
| 904 | + repeatedResponseType = TypeNode.withReference(repeatedGenericRef); |
| 905 | + break; |
| 906 | + } |
| 907 | + } |
| 908 | + |
| 909 | + Preconditions.checkNotNull( |
| 910 | + repeatedResponseType, |
| 911 | + String.format( |
| 912 | + "No repeated field found on message %s for method %s", |
| 913 | + methodOutputMessage.name(), method.name())); |
| 914 | + |
| 915 | + nestedClasses.add( |
| 916 | + createNestedRpcPagedResponseClass(method, repeatedResponseType, messageTypes, types)); |
| 917 | + nestedClasses.add( |
| 918 | + createNestedRpcPageClass(method, repeatedResponseType, messageTypes, types)); |
896 | 919 | }
|
897 | 920 |
|
898 | 921 | return nestedClasses;
|
899 | 922 | }
|
900 | 923 |
|
901 | 924 | private static ClassDefinition createNestedRpcPagedResponseClass(
|
902 |
| - Method method, Map<String, Message> messageTypes, Map<String, TypeNode> types) { |
| 925 | + Method method, |
| 926 | + TypeNode repeatedResponseType, |
| 927 | + Map<String, Message> messageTypes, |
| 928 | + Map<String, TypeNode> types) { |
903 | 929 | Preconditions.checkState(
|
904 | 930 | method.isPaged(), String.format("Expected method %s to be paged", method.name()));
|
905 | 931 |
|
906 | 932 | String className = String.format("%sPagedResponse", JavaStyle.toUpperCamelCase(method.name()));
|
907 | 933 | TypeNode thisClassType = types.get(className);
|
908 | 934 |
|
909 |
| - // Find the repeated field. |
910 |
| - Message methodOutputMessage = messageTypes.get(method.outputType().reference().name()); |
911 |
| - TypeNode repeatedResponseType = null; |
912 |
| - for (Field field : methodOutputMessage.fields()) { |
913 |
| - if (field.isRepeated() && !field.isMap()) { |
914 |
| - Reference repeatedGenericRef = field.type().reference().generics().get(0); |
915 |
| - repeatedResponseType = TypeNode.withReference(repeatedGenericRef); |
916 |
| - break; |
917 |
| - } |
918 |
| - } |
919 |
| - |
920 |
| - Preconditions.checkNotNull( |
921 |
| - repeatedResponseType, |
922 |
| - String.format( |
923 |
| - "No repeated field found on message %s for method %s", |
924 |
| - methodOutputMessage.name(), method.name())); |
925 |
| - |
926 | 935 | String upperJavaMethodName = JavaStyle.toUpperCamelCase(method.name());
|
927 | 936 | TypeNode methodPageType = types.get(String.format("%sPage", upperJavaMethodName));
|
928 | 937 | TypeNode classExtendsType =
|
@@ -1108,6 +1117,153 @@ private static ClassDefinition createNestedRpcPagedResponseClass(
|
1108 | 1117 | .build();
|
1109 | 1118 | }
|
1110 | 1119 |
|
| 1120 | + private static ClassDefinition createNestedRpcPageClass( |
| 1121 | + Method method, |
| 1122 | + TypeNode repeatedResponseType, |
| 1123 | + Map<String, Message> messageTypes, |
| 1124 | + Map<String, TypeNode> types) { |
| 1125 | + Preconditions.checkState( |
| 1126 | + method.isPaged(), String.format("Expected method %s to be paged", method.name())); |
| 1127 | + |
| 1128 | + String upperJavaMethodName = JavaStyle.toUpperCamelCase(method.name()); |
| 1129 | + String className = String.format("%sPage", upperJavaMethodName); |
| 1130 | + TypeNode classType = types.get(className); |
| 1131 | + TypeNode classExtendsType = |
| 1132 | + TypeNode.withReference( |
| 1133 | + ConcreteReference.builder() |
| 1134 | + .setClazz(AbstractPage.class) |
| 1135 | + .setGenerics( |
| 1136 | + Arrays.asList( |
| 1137 | + method.inputType(), |
| 1138 | + method.outputType(), |
| 1139 | + repeatedResponseType, |
| 1140 | + classType) |
| 1141 | + .stream() |
| 1142 | + .map(t -> t.reference()) |
| 1143 | + .collect(Collectors.toList())) |
| 1144 | + .build()); |
| 1145 | + |
| 1146 | + // Private constructor. |
| 1147 | + VariableExpr contextVarExpr = |
| 1148 | + VariableExpr.withVariable( |
| 1149 | + Variable.builder() |
| 1150 | + .setName("context") |
| 1151 | + .setType( |
| 1152 | + TypeNode.withReference( |
| 1153 | + ConcreteReference.builder() |
| 1154 | + .setClazz(PageContext.class) |
| 1155 | + .setGenerics( |
| 1156 | + Arrays.asList( |
| 1157 | + method.inputType(), |
| 1158 | + method.outputType(), |
| 1159 | + repeatedResponseType) |
| 1160 | + .stream() |
| 1161 | + .map(t -> t.reference()) |
| 1162 | + .collect(Collectors.toList())) |
| 1163 | + .build())) |
| 1164 | + .build()); |
| 1165 | + VariableExpr responseVarExpr = |
| 1166 | + VariableExpr.withVariable( |
| 1167 | + Variable.builder().setName("response").setType(method.outputType()).build()); |
| 1168 | + MethodDefinition privateCtor = |
| 1169 | + MethodDefinition.constructorBuilder() |
| 1170 | + .setScope(ScopeNode.PRIVATE) |
| 1171 | + .setReturnType(classType) |
| 1172 | + .setArguments( |
| 1173 | + Arrays.asList(contextVarExpr, responseVarExpr).stream() |
| 1174 | + .map(e -> e.toBuilder().setIsDecl(true).build()) |
| 1175 | + .collect(Collectors.toList())) |
| 1176 | + .setBody( |
| 1177 | + Arrays.asList( |
| 1178 | + ExprStatement.withExpr( |
| 1179 | + ReferenceConstructorExpr.superBuilder() |
| 1180 | + .setType(classExtendsType) |
| 1181 | + .setArguments(contextVarExpr, responseVarExpr) |
| 1182 | + .build()))) |
| 1183 | + .build(); |
| 1184 | + |
| 1185 | + // createEmptyPage method. |
| 1186 | + ValueExpr nullExpr = ValueExpr.withValue(NullObjectValue.create()); |
| 1187 | + MethodDefinition createEmptyPageMethod = |
| 1188 | + MethodDefinition.builder() |
| 1189 | + .setScope(ScopeNode.PRIVATE) |
| 1190 | + .setIsStatic(true) |
| 1191 | + .setReturnType(classType) |
| 1192 | + .setName("createEmptyPage") |
| 1193 | + .setReturnExpr( |
| 1194 | + NewObjectExpr.builder().setType(classType).setArguments(nullExpr, nullExpr).build()) |
| 1195 | + .build(); |
| 1196 | + |
| 1197 | + // createPage method. |
| 1198 | + MethodDefinition createPageMethod = |
| 1199 | + MethodDefinition.builder() |
| 1200 | + .setIsOverride(true) |
| 1201 | + .setScope(ScopeNode.PROTECTED) |
| 1202 | + .setReturnType(classType) |
| 1203 | + .setName("createPage") |
| 1204 | + .setArguments( |
| 1205 | + Arrays.asList(contextVarExpr, responseVarExpr).stream() |
| 1206 | + .map(e -> e.toBuilder().setIsDecl(true).build()) |
| 1207 | + .collect(Collectors.toList())) |
| 1208 | + .setReturnExpr( |
| 1209 | + NewObjectExpr.builder() |
| 1210 | + .setType(classType) |
| 1211 | + .setArguments(contextVarExpr, responseVarExpr) |
| 1212 | + .build()) |
| 1213 | + .build(); |
| 1214 | + |
| 1215 | + // createPageAsync method. |
| 1216 | + Function<TypeNode, TypeNode> futureTypeFn = |
| 1217 | + t -> |
| 1218 | + TypeNode.withReference( |
| 1219 | + ConcreteReference.builder() |
| 1220 | + .setClazz(ApiFuture.class) |
| 1221 | + .setGenerics(Arrays.asList(t.reference())) |
| 1222 | + .build()); |
| 1223 | + VariableExpr futureResponseVarExpr = |
| 1224 | + VariableExpr.withVariable( |
| 1225 | + Variable.builder() |
| 1226 | + .setName("futureResponse") |
| 1227 | + .setType(futureTypeFn.apply(method.outputType())) |
| 1228 | + .build()); |
| 1229 | + TypeNode futurePageType = futureTypeFn.apply(classType); |
| 1230 | + MethodDefinition createPageAsyncMethod = |
| 1231 | + MethodDefinition.builder() |
| 1232 | + .setIsOverride(true) |
| 1233 | + .setScope(ScopeNode.PUBLIC) |
| 1234 | + .setReturnType(futurePageType) |
| 1235 | + .setName("createPageAsync") |
| 1236 | + .setArguments( |
| 1237 | + Arrays.asList(contextVarExpr, futureResponseVarExpr).stream() |
| 1238 | + .map(e -> e.toBuilder().setIsDecl(true).build()) |
| 1239 | + .collect(Collectors.toList())) |
| 1240 | + .setReturnExpr( |
| 1241 | + MethodInvocationExpr.builder() |
| 1242 | + .setExprReferenceExpr( |
| 1243 | + ValueExpr.withValue(SuperObjectValue.withType(classExtendsType))) |
| 1244 | + .setMethodName("createPageAsync") |
| 1245 | + .setArguments(contextVarExpr, futureResponseVarExpr) |
| 1246 | + .setReturnType(futurePageType) |
| 1247 | + .build()) |
| 1248 | + .build(); |
| 1249 | + |
| 1250 | + // Build the class. |
| 1251 | + List<MethodDefinition> javaMethods = new ArrayList<>(); |
| 1252 | + javaMethods.add(privateCtor); |
| 1253 | + javaMethods.add(createEmptyPageMethod); |
| 1254 | + javaMethods.add(createPageMethod); |
| 1255 | + javaMethods.add(createPageAsyncMethod); |
| 1256 | + |
| 1257 | + return ClassDefinition.builder() |
| 1258 | + .setIsNested(true) |
| 1259 | + .setScope(ScopeNode.PUBLIC) |
| 1260 | + .setIsStatic(true) |
| 1261 | + .setExtendsType(classExtendsType) |
| 1262 | + .setName(className) |
| 1263 | + .setMethods(javaMethods) |
| 1264 | + .build(); |
| 1265 | + } |
| 1266 | + |
1111 | 1267 | private static Map<String, TypeNode> createTypes(
|
1112 | 1268 | Service service, Map<String, Message> messageTypes) {
|
1113 | 1269 | Map<String, TypeNode> types = new HashMap<>();
|
|
0 commit comments