Skip to content

Commit c6492ee

Browse files
committed
Sync pagination implementation to get initial feedback
1 parent feead21 commit c6492ee

File tree

25 files changed

+1043
-21
lines changed

25 files changed

+1043
-21
lines changed

codegen-maven-plugin/src/main/java/software/amazon/awssdk/codegen/maven/plugin/GenerationMojo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import software.amazon.awssdk.codegen.model.config.BasicCodeGenConfig;
3636
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
3737
import software.amazon.awssdk.codegen.model.intermediate.ServiceExamples;
38+
import software.amazon.awssdk.codegen.model.service.Paginators;
3839
import software.amazon.awssdk.codegen.model.service.ServiceModel;
3940
import software.amazon.awssdk.codegen.model.service.Waiters;
4041
import software.amazon.awssdk.codegen.utils.ModelLoaderUtils;
@@ -50,6 +51,7 @@ public class GenerationMojo extends AbstractMojo {
5051
private static final String CUSTOMIZATION_CONFIG_FILE = "customization.config";
5152
private static final String EXAMPLES_FILE = "examples-1.json";
5253
private static final String WAITERS_FILE = "waiters-2.json";
54+
private static final String PAGINATORS_FILE = "paginators.json";
5355

5456
@Parameter(property = "codeGenResources", defaultValue = "${basedir}/src/main/resources/codegen-resources/")
5557
private File codeGenResources;
@@ -75,6 +77,7 @@ public void execute() throws MojoExecutionException {
7577
.customizationConfig(loadCustomizationConfig(p))
7678
.serviceModel(loadServiceModel(p))
7779
.waitersModel(loadWaiterModel(p))
80+
.paginatorsModel(loadPaginatorModel(p))
7881
.examplesModel(loadExamplesModel(p))
7982
.build());
8083
} catch (MojoExecutionException e) {
@@ -134,6 +137,10 @@ private Waiters loadWaiterModel(Path root) {
134137
return loadOptionalModel(Waiters.class, root.resolve(WAITERS_FILE)).orElse(Waiters.NONE);
135138
}
136139

140+
private Paginators loadPaginatorModel(Path root) {
141+
return loadOptionalModel(Paginators.class, root.resolve(PAGINATORS_FILE)).orElse(Paginators.NONE);
142+
}
143+
137144
/**
138145
* Load required model from the project resources.
139146
*/

codegen/src/main/java/software/amazon/awssdk/codegen/AddMetadata.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public static Metadata constructMetadata(ServiceModel serviceModel,
7575
.withTransformPackageName(Utils.getTransformPackageName(serviceName, customizationConfig))
7676
.withRequestTransformPackageName(Utils.getRequestTransformPackageName(serviceName, customizationConfig))
7777
.withWaitersPackageName(Utils.getWaitersPackageName(serviceName, customizationConfig))
78+
.withPaginatorsPackageName(Utils.getPaginatorsPackageName(serviceName, customizationConfig))
7879
.withSmokeTestsPackageName(Utils.getSmokeTestPackageName(serviceName, customizationConfig))
7980
.withServiceAbbreviation(serviceMetadata.getServiceAbbreviation())
8081
.withServiceFullName(serviceMetadata.getServiceFullName())

codegen/src/main/java/software/amazon/awssdk/codegen/C2jModels.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import software.amazon.awssdk.codegen.model.config.BasicCodeGenConfig;
1919
import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig;
2020
import software.amazon.awssdk.codegen.model.intermediate.ServiceExamples;
21+
import software.amazon.awssdk.codegen.model.service.Paginators;
2122
import software.amazon.awssdk.codegen.model.service.ServiceModel;
2223
import software.amazon.awssdk.codegen.model.service.Waiters;
2324

@@ -31,14 +32,17 @@ public class C2jModels {
3132
private final ServiceExamples examplesModel;
3233
private final BasicCodeGenConfig codeGenConfig;
3334
private final CustomizationConfig customizationConfig;
35+
private final Paginators paginatorsModel;
3436

3537
private C2jModels(ServiceModel serviceModel, Waiters waitersModel, ServiceExamples examplesModel,
36-
BasicCodeGenConfig codeGenConfig, CustomizationConfig customizationConfig) {
38+
BasicCodeGenConfig codeGenConfig, CustomizationConfig customizationConfig,
39+
Paginators paginatorsModel) {
3740
this.serviceModel = serviceModel;
3841
this.waitersModel = waitersModel;
3942
this.examplesModel = examplesModel;
4043
this.codeGenConfig = codeGenConfig;
4144
this.customizationConfig = customizationConfig;
45+
this.paginatorsModel = paginatorsModel;
4246
}
4347

4448
public static Builder builder() {
@@ -65,13 +69,18 @@ public CustomizationConfig customizationConfig() {
6569
return customizationConfig;
6670
}
6771

72+
public Paginators paginatorsModel() {
73+
return paginatorsModel;
74+
}
75+
6876
public static class Builder {
6977

7078
private ServiceModel serviceModel;
7179
private Waiters waitersModel;
7280
private ServiceExamples examplesModel;
7381
private BasicCodeGenConfig codeGenConfig;
7482
private CustomizationConfig customizationConfig;
83+
private Paginators paginatorsModel;
7584

7685
private Builder() {
7786
}
@@ -101,10 +110,16 @@ public Builder customizationConfig(CustomizationConfig customizationConfig) {
101110
return this;
102111
}
103112

113+
public Builder paginatorsModel(Paginators paginatorsModel) {
114+
this.paginatorsModel = paginatorsModel;
115+
return this;
116+
}
117+
104118
public C2jModels build() {
105119
final Waiters waiters = waitersModel != null ? waitersModel : Waiters.NONE;
120+
final Paginators paginators = paginatorsModel != null ? paginatorsModel : Paginators.NONE;
106121
final ServiceExamples examples = examplesModel != null ? examplesModel : ServiceExamples.NONE;
107-
return new C2jModels(serviceModel, waiters, examples, codeGenConfig, customizationConfig);
122+
return new C2jModels(serviceModel, waiters, examples, codeGenConfig, customizationConfig, paginators);
108123
}
109124
}
110125
}

codegen/src/main/java/software/amazon/awssdk/codegen/IntermediateModelBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import software.amazon.awssdk.codegen.model.intermediate.WaiterDefinitionModel;
4545
import software.amazon.awssdk.codegen.model.service.AuthType;
4646
import software.amazon.awssdk.codegen.model.service.Operation;
47+
import software.amazon.awssdk.codegen.model.service.Paginators;
4748
import software.amazon.awssdk.codegen.model.service.ServiceModel;
4849
import software.amazon.awssdk.codegen.model.service.Waiters;
4950
import software.amazon.awssdk.codegen.naming.DefaultNamingStrategy;
@@ -65,6 +66,7 @@ public class IntermediateModelBuilder {
6566
private final TypeUtils typeUtils;
6667
private final List<IntermediateModelShapeProcessor> shapeProcessors;
6768
private final Waiters waiters;
69+
private final Paginators paginators;
6870

6971
public IntermediateModelBuilder(C2jModels models) {
7072
this.customConfig = models.customizationConfig();
@@ -75,6 +77,7 @@ public IntermediateModelBuilder(C2jModels models) {
7577
this.typeUtils = new TypeUtils(namingStrategy);
7678
this.shapeProcessors = createShapeProcessors();
7779
this.waiters = models.waitersModel();
80+
this.paginators = models.paginatorsModel();
7881
}
7982

8083

@@ -123,7 +126,7 @@ public IntermediateModel build() throws IOException {
123126

124127
IntermediateModel fullModel = new IntermediateModel(
125128
constructMetadata(service, codeGenConfig, customConfig), operations, shapes,
126-
customConfig, examples, waiters, authorizers);
129+
customConfig, examples, waiters, authorizers, paginators.getPaginators());
127130

128131
customization.postprocess(fullModel);
129132

@@ -139,7 +142,8 @@ public IntermediateModel build() throws IOException {
139142
fullModel.getCustomizationConfig(),
140143
fullModel.getExamples(),
141144
fullModel.getWaiters(),
142-
fullModel.getCustomAuthorizers());
145+
fullModel.getCustomAuthorizers(),
146+
fullModel.getPaginators());
143147

144148
linkMembersToShapes(trimmedModel);
145149
linkOperationsToInputOutputShapes(trimmedModel);

codegen/src/main/java/software/amazon/awssdk/codegen/emitters/GeneratorPathProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public String getWaitersDirectory() {
6262
return sourceDirectory + "/" + Utils.packageToDirectory(model.getMetadata().getFullWaitersPackageName());
6363
}
6464

65+
public String getPaginatorsDirectory() {
66+
return sourceDirectory + "/" + Utils.packageToDirectory(model.getMetadata().getFullPaginatorsPackageName());
67+
}
68+
6569
public String getPolicyEnumDirectory() {
6670
return sourceDirectory + "/" + Constants.AUTH_POLICY_ENUM_CLASS_DIR;
6771
}

codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/AwsGeneratorTasks.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public AwsGeneratorTasks(GeneratorTaskParams params) {
3434

3535
private Iterable<GeneratorTask> createAwsTasks(GeneratorTaskParams params) {
3636
return new CompositeIterable<>(new AsyncClientGeneratorTasks(params),
37-
new WaitersGeneratorTasks(params));
37+
new WaitersGeneratorTasks(params),
38+
new PaginatorsGeneratorTasks(params));
3839
}
3940

4041
@Override
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2011-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at:
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
11+
* OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
* License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
package software.amazon.awssdk.codegen.emitters.tasks;
16+
17+
import software.amazon.awssdk.codegen.emitters.GeneratorTask;
18+
import software.amazon.awssdk.codegen.emitters.GeneratorTaskParams;
19+
import software.amazon.awssdk.codegen.emitters.PoetGeneratorTask;
20+
import software.amazon.awssdk.codegen.model.service.PaginatorDefinition;
21+
import software.amazon.awssdk.codegen.poet.ClassSpec;
22+
import software.amazon.awssdk.codegen.poet.model.PaginatorResponseClassSpec;
23+
24+
import java.io.IOException;
25+
import java.util.ArrayList;
26+
import java.util.List;
27+
import java.util.Map;
28+
29+
import static software.amazon.awssdk.utils.FunctionalUtils.safeFunction;
30+
31+
public class PaginatorsGeneratorTasks extends BaseGeneratorTasks {
32+
33+
private final String modelClassDir;
34+
35+
public PaginatorsGeneratorTasks(GeneratorTaskParams dependencies) {
36+
super(dependencies);
37+
this.modelClassDir = dependencies.getPathProvider().getModelDirectory();
38+
}
39+
40+
@Override
41+
protected boolean hasTasks() {
42+
return model.getHasPaginators();
43+
}
44+
45+
@Override
46+
protected List<GeneratorTask> createTasks() throws Exception {
47+
info("Emitting paginator classes");
48+
List<GeneratorTask> tasks = new ArrayList<>();
49+
50+
model.getPaginators().entrySet().stream()
51+
.map(safeFunction(this::createTask))
52+
.forEach(tasks::add);
53+
54+
return tasks;
55+
}
56+
57+
private GeneratorTask createTask(Map.Entry<String, PaginatorDefinition> entry) throws IOException {
58+
59+
ClassSpec classSpec = new PaginatorResponseClassSpec(model, entry.getKey(), entry.getValue());
60+
61+
return new PoetGeneratorTask(modelClassDir, model.getFileHeader(), classSpec);
62+
}
63+
64+
}

codegen/src/main/java/software/amazon/awssdk/codegen/internal/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ public class Constants {
5050

5151
public static final String PACKAGE_NAME_WAITERS_PATTERN = "%s.waiters";
5252

53+
public static final String PACKAGE_NAME_PAGINATORS_PATTERN = "%s.paginators";
54+
5355
public static final String PACKAGE_NAME_SMOKE_TEST_PATTERN = "%s.smoketests";
5456

5557
public static final String PACKAGE_NAME_CUSTOM_AUTH_PATTERN = "%s.auth";

codegen/src/main/java/software/amazon/awssdk/codegen/internal/Utils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ public static String getWaitersPackageName(String serviceName, CustomizationConf
118118
Constants.PACKAGE_NAME_WAITERS_PATTERN);
119119
}
120120

121+
public static String getPaginatorsPackageName(String serviceName, CustomizationConfig customizationConfig) {
122+
return getCustomizedPackageName(serviceName, Constants.PACKAGE_NAME_PAGINATORS_PATTERN);
123+
}
124+
121125
public static String getSmokeTestPackageName(String serviceName, CustomizationConfig customizationConfig) {
122126
return getCustomizedPackageName(serviceName,
123127
Constants.PACKAGE_NAME_SMOKE_TEST_PATTERN);

codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/IntermediateModel.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import software.amazon.awssdk.core.AmazonWebServiceResult;
2929
import software.amazon.awssdk.core.ResponseMetadata;
3030
import software.amazon.awssdk.core.util.ValidationUtils;
31+
import software.amazon.awssdk.codegen.model.service.PaginatorDefinition;
3132
import software.amazon.awssdk.utils.IoUtils;
3233

3334
public final class IntermediateModel {
@@ -52,6 +53,9 @@ public final class IntermediateModel {
5253
@JsonIgnore
5354
private final Map<String, WaiterDefinitionModel> waiters;
5455

56+
@JsonIgnore
57+
private final Map<String, PaginatorDefinition> paginators;
58+
5559
@JsonCreator
5660
public IntermediateModel(
5761
@JsonProperty("metadata") Metadata metadata,
@@ -60,7 +64,8 @@ public IntermediateModel(
6064
@JsonProperty("customizationConfig") CustomizationConfig customizationConfig,
6165
@JsonProperty("serviceExamples") ServiceExamples examples) {
6266

63-
this(metadata, operations, shapes, customizationConfig, examples, Collections.emptyMap(), Collections.emptyMap());
67+
this(metadata, operations, shapes, customizationConfig, examples, Collections.emptyMap(),
68+
Collections.emptyMap(), Collections.emptyMap());
6469
}
6570

6671
public IntermediateModel(
@@ -70,14 +75,16 @@ public IntermediateModel(
7075
CustomizationConfig customizationConfig,
7176
ServiceExamples examples,
7277
Map<String, WaiterDefinitionModel> waiters,
73-
Map<String, AuthorizerModel> customAuthorizers) {
78+
Map<String, AuthorizerModel> customAuthorizers,
79+
Map<String, PaginatorDefinition> paginators) {
7480
this.metadata = metadata;
7581
this.operations = operations;
7682
this.shapes = shapes;
7783
this.customizationConfig = customizationConfig;
7884
this.examples = examples;
7985
this.waiters = ValidationUtils.assertNotNull(waiters, "waiters");
8086
this.customAuthorizers = customAuthorizers;
87+
this.paginators = paginators;
8188
}
8289

8390
public Metadata getMetadata() {
@@ -112,6 +119,10 @@ public Map<String, WaiterDefinitionModel> getWaiters() {
112119
return waiters;
113120
}
114121

122+
public Map<String, PaginatorDefinition> getPaginators() {
123+
return paginators;
124+
}
125+
115126
/**
116127
* @return Exception unmarshaller implementation to use. Currently only needed by XML based
117128
* protocols.
@@ -169,6 +180,10 @@ public boolean getHasWaiters() {
169180
return waiters.size() > 0;
170181
}
171182

183+
public boolean getHasPaginators() {
184+
return paginators.size() > 0;
185+
}
186+
172187
public String getSdkBaseResponseFqcn() {
173188
if (metadata.getProtocol() == Protocol.API_GATEWAY) {
174189
return "software.amazon.awssdk.opensdk.BaseResult";

codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/Metadata.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ public class Metadata {
7171

7272
private String waitersPackageName;
7373

74+
private String paginatorsPackageName;
75+
7476
private String authPolicyPackageName;
7577

7678
private String smokeTestsPackageName;
@@ -452,6 +454,23 @@ public Metadata withWaitersPackageName(String waitersPackageName) {
452454
return this;
453455
}
454456

457+
public String getFullPaginatorsPackageName() {
458+
return joinPackageNames(rootPackageName, getPaginatorsPackageName());
459+
}
460+
461+
public String getPaginatorsPackageName() {
462+
return paginatorsPackageName;
463+
}
464+
465+
public void setPaginatorsPackageName(String paginatorsPackageName) {
466+
this.paginatorsPackageName = paginatorsPackageName;
467+
}
468+
469+
public Metadata withPaginatorsPackageName(String paginatorsPackageName) {
470+
setPaginatorsPackageName(paginatorsPackageName);
471+
return this;
472+
}
473+
455474
public String getFullAuthPolicyPackageName() {
456475
return joinPackageNames(rootPackageName, getAuthPolicyPackageName());
457476
}

0 commit comments

Comments
 (0)