Skip to content

Commit d8f9e35

Browse files
committed
Add auto construct container fixes
- Check for auto construct containers on paginator termination condition - Enable autoconstruct list for DDB - Fix broken tests
1 parent 65cdce5 commit d8f9e35

File tree

21 files changed

+94
-56
lines changed

21 files changed

+94
-56
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpec.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import software.amazon.awssdk.codegen.poet.ClassSpec;
3535
import software.amazon.awssdk.codegen.poet.PoetExtensions;
3636
import software.amazon.awssdk.codegen.poet.model.TypeProvider;
37+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
38+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
3739

3840
public abstract class PaginatorsClassSpec implements ClassSpec {
3941

@@ -165,21 +167,24 @@ protected MemberModel memberModelForResponseMember(String input) {
165167
return shape.getMemberByC2jName(hierarchy[hierarchy.length - 1]);
166168
}
167169

168-
protected String hasNextPageMethodBody() {
169-
String body;
170+
protected CodeBlock hasNextPageMethodBody() {
170171

171172
if (paginatorDefinition.getMoreResults() != null) {
172-
body = String.format("return %s.%s.booleanValue()",
173+
return CodeBlock.builder()
174+
.add("return $N.$L.booleanValue()",
173175
PREVIOUS_PAGE_METHOD_ARGUMENT,
174-
fluentGetterMethodForResponseMember(paginatorDefinition.getMoreResults()));
175-
} else {
176-
// If there is no more_results token, then output_token will be a single value
177-
body = String.format("return %s.%s != null",
178-
PREVIOUS_PAGE_METHOD_ARGUMENT,
179-
fluentGetterMethodsForOutputToken().get(0));
176+
fluentGetterMethodForResponseMember(paginatorDefinition.getMoreResults()))
177+
.build();
180178
}
179+
// If there is no more_results token, then output_token will be a single value
180+
return CodeBlock.builder()
181+
.add("return $1N.$2L != null && !$3T.class.isInstance($1N.$2L) && !$4T.class.isInstance($1N.$2L)",
182+
PREVIOUS_PAGE_METHOD_ARGUMENT,
183+
fluentGetterMethodsForOutputToken().get(0),
184+
SdkAutoConstructList.class,
185+
SdkAutoConstructMap.class)
186+
.build();
181187

182-
return body;
183188
}
184189

185190
/*

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/paginators/PaginatedOperationWithResultKeyIterable.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import software.amazon.awssdk.core.pagination.sync.PaginatedResponsesIterator;
99
import software.amazon.awssdk.core.pagination.sync.SdkIterable;
1010
import software.amazon.awssdk.core.pagination.sync.SyncPageFetcher;
11+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
12+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
1113
import software.amazon.awssdk.services.jsonprotocoltests.JsonProtocolTestsClient;
1214
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithResultKeyRequest;
1315
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithResultKeyResponse;
@@ -76,7 +78,7 @@ public class PaginatedOperationWithResultKeyIterable implements SdkIterable<Pagi
7678
private final SyncPageFetcher nextPageFetcher;
7779

7880
public PaginatedOperationWithResultKeyIterable(JsonProtocolTestsClient client,
79-
PaginatedOperationWithResultKeyRequest firstRequest) {
81+
PaginatedOperationWithResultKeyRequest firstRequest) {
8082
this.client = client;
8183
this.firstRequest = firstRequest;
8284
this.nextPageFetcher = new PaginatedOperationWithResultKeyResponseFetcher();
@@ -116,7 +118,7 @@ public final SdkIterable<SimpleStruct> items() {
116118
private final PaginatedOperationWithResultKeyIterable resume(PaginatedOperationWithResultKeyResponse lastSuccessfulPage) {
117119
if (nextPageFetcher.hasNextPage(lastSuccessfulPage)) {
118120
return new PaginatedOperationWithResultKeyIterable(client, firstRequest.toBuilder()
119-
.nextToken(lastSuccessfulPage.nextToken()).build());
121+
.nextToken(lastSuccessfulPage.nextToken()).build());
120122
}
121123
return new PaginatedOperationWithResultKeyIterable(client, firstRequest) {
122124
@Override
@@ -127,10 +129,11 @@ public Iterator<PaginatedOperationWithResultKeyResponse> iterator() {
127129
}
128130

129131
private class PaginatedOperationWithResultKeyResponseFetcher implements
130-
SyncPageFetcher<PaginatedOperationWithResultKeyResponse> {
132+
SyncPageFetcher<PaginatedOperationWithResultKeyResponse> {
131133
@Override
132134
public boolean hasNextPage(PaginatedOperationWithResultKeyResponse previousPage) {
133-
return previousPage.nextToken() != null;
135+
return previousPage.nextToken() != null && !SdkAutoConstructList.class.isInstance(previousPage.nextToken())
136+
&& !SdkAutoConstructMap.class.isInstance(previousPage.nextToken());
134137
}
135138

136139
@Override

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/paginators/PaginatedOperationWithResultKeyPublisher.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import software.amazon.awssdk.core.pagination.async.PaginatedItemsPublisher;
1212
import software.amazon.awssdk.core.pagination.async.ResponsesSubscription;
1313
import software.amazon.awssdk.core.pagination.async.SdkPublisher;
14+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
15+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
1416
import software.amazon.awssdk.services.jsonprotocoltests.JsonProtocolTestsAsyncClient;
1517
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithResultKeyRequest;
1618
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithResultKeyResponse;
@@ -79,12 +81,12 @@ public class PaginatedOperationWithResultKeyPublisher implements SdkPublisher<Pa
7981
private boolean isLastPage;
8082

8183
public PaginatedOperationWithResultKeyPublisher(JsonProtocolTestsAsyncClient client,
82-
PaginatedOperationWithResultKeyRequest firstRequest) {
84+
PaginatedOperationWithResultKeyRequest firstRequest) {
8385
this(client, firstRequest, false);
8486
}
8587

8688
private PaginatedOperationWithResultKeyPublisher(JsonProtocolTestsAsyncClient client,
87-
PaginatedOperationWithResultKeyRequest firstRequest, boolean isLastPage) {
89+
PaginatedOperationWithResultKeyRequest firstRequest, boolean isLastPage) {
8890
this.client = client;
8991
this.firstRequest = firstRequest;
9092
this.isLastPage = isLastPage;
@@ -109,7 +111,7 @@ public final SdkPublisher<SimpleStruct> items() {
109111
return Collections.emptyIterator();
110112
};
111113
return PaginatedItemsPublisher.builder().nextPageFetcher(new PaginatedOperationWithResultKeyResponseFetcher())
112-
.iteratorFunction(getIterator).isLastPage(isLastPage).build();
114+
.iteratorFunction(getIterator).isLastPage(isLastPage).build();
113115
}
114116

115117
/**
@@ -122,7 +124,7 @@ public final SdkPublisher<SimpleStruct> items() {
122124
private final PaginatedOperationWithResultKeyPublisher resume(PaginatedOperationWithResultKeyResponse lastSuccessfulPage) {
123125
if (nextPageFetcher.hasNextPage(lastSuccessfulPage)) {
124126
return new PaginatedOperationWithResultKeyPublisher(client, firstRequest.toBuilder()
125-
.nextToken(lastSuccessfulPage.nextToken()).build());
127+
.nextToken(lastSuccessfulPage.nextToken()).build());
126128
}
127129
return new PaginatedOperationWithResultKeyPublisher(client, firstRequest, true) {
128130
@Override
@@ -133,15 +135,16 @@ public void subscribe(Subscriber<? super PaginatedOperationWithResultKeyResponse
133135
}
134136

135137
private class PaginatedOperationWithResultKeyResponseFetcher implements
136-
AsyncPageFetcher<PaginatedOperationWithResultKeyResponse> {
138+
AsyncPageFetcher<PaginatedOperationWithResultKeyResponse> {
137139
@Override
138140
public boolean hasNextPage(final PaginatedOperationWithResultKeyResponse previousPage) {
139-
return previousPage.nextToken() != null;
141+
return previousPage.nextToken() != null && !SdkAutoConstructList.class.isInstance(previousPage.nextToken())
142+
&& !SdkAutoConstructMap.class.isInstance(previousPage.nextToken());
140143
}
141144

142145
@Override
143146
public CompletableFuture<PaginatedOperationWithResultKeyResponse> nextPage(
144-
final PaginatedOperationWithResultKeyResponse previousPage) {
147+
final PaginatedOperationWithResultKeyResponse previousPage) {
145148
if (previousPage == null) {
146149
return client.paginatedOperationWithResultKey(firstRequest);
147150
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/paginators/PaginatedOperationWithoutResultKeyIterable.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import software.amazon.awssdk.core.pagination.sync.PaginatedResponsesIterator;
77
import software.amazon.awssdk.core.pagination.sync.SdkIterable;
88
import software.amazon.awssdk.core.pagination.sync.SyncPageFetcher;
9+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
10+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
911
import software.amazon.awssdk.services.jsonprotocoltests.JsonProtocolTestsClient;
1012
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithoutResultKeyRequest;
1113
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithoutResultKeyResponse;
@@ -73,7 +75,7 @@ public class PaginatedOperationWithoutResultKeyIterable implements SdkIterable<P
7375
private final SyncPageFetcher nextPageFetcher;
7476

7577
public PaginatedOperationWithoutResultKeyIterable(JsonProtocolTestsClient client,
76-
PaginatedOperationWithoutResultKeyRequest firstRequest) {
78+
PaginatedOperationWithoutResultKeyRequest firstRequest) {
7779
this.client = client;
7880
this.firstRequest = firstRequest;
7981
this.nextPageFetcher = new PaginatedOperationWithoutResultKeyResponseFetcher();
@@ -94,7 +96,7 @@ public Iterator<PaginatedOperationWithoutResultKeyResponse> iterator() {
9496
private final PaginatedOperationWithoutResultKeyIterable resume(PaginatedOperationWithoutResultKeyResponse lastSuccessfulPage) {
9597
if (nextPageFetcher.hasNextPage(lastSuccessfulPage)) {
9698
return new PaginatedOperationWithoutResultKeyIterable(client, firstRequest.toBuilder()
97-
.nextToken(lastSuccessfulPage.nextToken()).build());
99+
.nextToken(lastSuccessfulPage.nextToken()).build());
98100
}
99101
return new PaginatedOperationWithoutResultKeyIterable(client, firstRequest) {
100102
@Override
@@ -105,10 +107,11 @@ public Iterator<PaginatedOperationWithoutResultKeyResponse> iterator() {
105107
}
106108

107109
private class PaginatedOperationWithoutResultKeyResponseFetcher implements
108-
SyncPageFetcher<PaginatedOperationWithoutResultKeyResponse> {
110+
SyncPageFetcher<PaginatedOperationWithoutResultKeyResponse> {
109111
@Override
110112
public boolean hasNextPage(PaginatedOperationWithoutResultKeyResponse previousPage) {
111-
return previousPage.nextToken() != null;
113+
return previousPage.nextToken() != null && !SdkAutoConstructList.class.isInstance(previousPage.nextToken())
114+
&& !SdkAutoConstructMap.class.isInstance(previousPage.nextToken());
112115
}
113116

114117
@Override
@@ -117,7 +120,7 @@ public PaginatedOperationWithoutResultKeyResponse nextPage(PaginatedOperationWit
117120
return client.paginatedOperationWithoutResultKey(firstRequest);
118121
}
119122
return client
120-
.paginatedOperationWithoutResultKey(firstRequest.toBuilder().nextToken(previousPage.nextToken()).build());
123+
.paginatedOperationWithoutResultKey(firstRequest.toBuilder().nextToken(previousPage.nextToken()).build());
121124
}
122125
}
123126
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/paginators/PaginatedOperationWithoutResultKeyPublisher.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import software.amazon.awssdk.core.pagination.async.EmptySubscription;
88
import software.amazon.awssdk.core.pagination.async.ResponsesSubscription;
99
import software.amazon.awssdk.core.pagination.async.SdkPublisher;
10+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
11+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
1012
import software.amazon.awssdk.services.jsonprotocoltests.JsonProtocolTestsAsyncClient;
1113
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithoutResultKeyRequest;
1214
import software.amazon.awssdk.services.jsonprotocoltests.model.PaginatedOperationWithoutResultKeyResponse;
@@ -74,12 +76,12 @@ public class PaginatedOperationWithoutResultKeyPublisher implements SdkPublisher
7476
private boolean isLastPage;
7577

7678
public PaginatedOperationWithoutResultKeyPublisher(JsonProtocolTestsAsyncClient client,
77-
PaginatedOperationWithoutResultKeyRequest firstRequest) {
79+
PaginatedOperationWithoutResultKeyRequest firstRequest) {
7880
this(client, firstRequest, false);
7981
}
8082

8183
private PaginatedOperationWithoutResultKeyPublisher(JsonProtocolTestsAsyncClient client,
82-
PaginatedOperationWithoutResultKeyRequest firstRequest, boolean isLastPage) {
84+
PaginatedOperationWithoutResultKeyRequest firstRequest, boolean isLastPage) {
8385
this.client = client;
8486
this.firstRequest = firstRequest;
8587
this.isLastPage = isLastPage;
@@ -101,7 +103,7 @@ public void subscribe(Subscriber<? super PaginatedOperationWithoutResultKeyRespo
101103
private final PaginatedOperationWithoutResultKeyPublisher resume(PaginatedOperationWithoutResultKeyResponse lastSuccessfulPage) {
102104
if (nextPageFetcher.hasNextPage(lastSuccessfulPage)) {
103105
return new PaginatedOperationWithoutResultKeyPublisher(client, firstRequest.toBuilder()
104-
.nextToken(lastSuccessfulPage.nextToken()).build());
106+
.nextToken(lastSuccessfulPage.nextToken()).build());
105107
}
106108
return new PaginatedOperationWithoutResultKeyPublisher(client, firstRequest, true) {
107109
@Override
@@ -112,20 +114,21 @@ public void subscribe(Subscriber<? super PaginatedOperationWithoutResultKeyRespo
112114
}
113115

114116
private class PaginatedOperationWithoutResultKeyResponseFetcher implements
115-
AsyncPageFetcher<PaginatedOperationWithoutResultKeyResponse> {
117+
AsyncPageFetcher<PaginatedOperationWithoutResultKeyResponse> {
116118
@Override
117119
public boolean hasNextPage(final PaginatedOperationWithoutResultKeyResponse previousPage) {
118-
return previousPage.nextToken() != null;
120+
return previousPage.nextToken() != null && !SdkAutoConstructList.class.isInstance(previousPage.nextToken())
121+
&& !SdkAutoConstructMap.class.isInstance(previousPage.nextToken());
119122
}
120123

121124
@Override
122125
public CompletableFuture<PaginatedOperationWithoutResultKeyResponse> nextPage(
123-
final PaginatedOperationWithoutResultKeyResponse previousPage) {
126+
final PaginatedOperationWithoutResultKeyResponse previousPage) {
124127
if (previousPage == null) {
125128
return client.paginatedOperationWithoutResultKey(firstRequest);
126129
}
127130
return client
128-
.paginatedOperationWithoutResultKey(firstRequest.toBuilder().nextToken(previousPage.nextToken()).build());
131+
.paginatedOperationWithoutResultKey(firstRequest.toBuilder().nextToken(previousPage.nextToken()).build());
129132
}
130133
}
131134
}

services/dynamodb/src/it/java/software/amazon/awssdk/services/dynamodb/DynamoServiceIntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.junit.runner.RunWith;
3636
import software.amazon.awssdk.awscore.exception.AwsServiceException;
3737
import software.amazon.awssdk.core.SdkBytes;
38+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
3839
import software.amazon.awssdk.services.dynamodb.model.AttributeAction;
3940
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
4041
import software.amazon.awssdk.services.dynamodb.model.AttributeValueUpdate;
@@ -383,7 +384,7 @@ public void testServiceOperations() throws Exception {
383384
GetItemRequest itemsRequest = GetItemRequest.builder().tableName(tableName).key(mapKey(HASH_KEY_NAME, AttributeValue.builder().s("3").build()))
384385
.consistentRead(true).build();
385386
GetItemResponse itemsResult = dynamo.getItem(itemsRequest);
386-
assertNull(itemsResult.item());
387+
assertTrue(itemsResult.item() instanceof SdkAutoConstructMap);
387388

388389
// Get an item that doesn't have any attributes,
389390
itemsRequest = GetItemRequest.builder().tableName(tableName).key(mapKey(HASH_KEY_NAME, AttributeValue.builder().s("bar").build()))

services/dynamodb/src/it/java/software/amazon/awssdk/services/dynamodb/SecondaryIndexesIntegrationTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.junit.Test;
3131
import org.junit.runner.RunWith;
3232
import software.amazon.awssdk.core.exception.SdkServiceException;
33+
import software.amazon.awssdk.core.util.SdkAutoConstructList;
3334
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
3435
import software.amazon.awssdk.services.dynamodb.model.ComparisonOperator;
3536
import software.amazon.awssdk.services.dynamodb.model.Condition;
@@ -111,8 +112,8 @@ public void testDescribeTempTableWithIndexes() {
111112
assertEquals(ProjectionType.KEYS_ONLY,
112113
tableDescription.localSecondaryIndexes().get(0)
113114
.projection().projectionType());
114-
assertEquals(null, tableDescription.localSecondaryIndexes().get(0)
115-
.projection().nonKeyAttributes());
115+
assertTrue(tableDescription.localSecondaryIndexes().get(0)
116+
.projection().nonKeyAttributes() instanceof SdkAutoConstructList);
116117

117118
assertEquals(1, tableDescription.globalSecondaryIndexes().size());
118119
assertEquals(GSI_NAME, tableDescription
@@ -130,8 +131,8 @@ public void testDescribeTempTableWithIndexes() {
130131
assertEquals(ProjectionType.KEYS_ONLY,
131132
tableDescription.globalSecondaryIndexes().get(0)
132133
.projection().projectionType());
133-
assertEquals(null, tableDescription.globalSecondaryIndexes().get(0)
134-
.projection().nonKeyAttributes());
134+
assertTrue(tableDescription.globalSecondaryIndexes().get(0)
135+
.projection().nonKeyAttributes() instanceof SdkAutoConstructList);
135136

136137
}
137138

services/dynamodb/src/main/resources/codegen-resources/dynamodb/customization.config

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,5 @@
1616
]
1717
}
1818
},
19-
"customRetryPolicy" : "software.amazon.awssdk.services.dynamodb.DynamoDbRetryPolicy",
20-
"useAutoConstructList": false
19+
"customRetryPolicy" : "software.amazon.awssdk.services.dynamodb.DynamoDbRetryPolicy"
2120
}

services/dynamodb/src/main/resources/codegen-resources/dynamodbstreams/customization.config

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,5 @@
3434
"packageName" : "streams"
3535
},
3636

37-
"skipSmokeTests": "true",
38-
39-
"useAutoConstructList": false
37+
"skipSmokeTests": "true"
4038
}

test/dynamodbdocument-v1/src/it/java/software/amazon/awssdk/services/dynamodb/NestedJsonDocumentIntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.junit.BeforeClass;
2424
import org.junit.Test;
2525
import software.amazon.awssdk.core.exception.SdkServiceException;
26+
import software.amazon.awssdk.core.util.SdkAutoConstructMap;
2627
import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;
2728
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
2829
import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;
@@ -127,7 +128,7 @@ private AttributeValue buildNestedMapAttribute(int depth) {
127128

128129
private int computeDepthOfNestedMapAttribute(AttributeValue mapAttr) {
129130
int depth = 0;
130-
while (mapAttr != null && mapAttr.m() != null) {
131+
while (mapAttr != null && mapAttr.m() != null && !(mapAttr.m() instanceof SdkAutoConstructMap)) {
131132
depth++;
132133
mapAttr = mapAttr.m().get(JSON_MAP_NESTED_KEY);
133134
}

0 commit comments

Comments
 (0)