Skip to content

Commit 13a6e6d

Browse files
authored
Fix stringarray (#5506)
1 parent 2ba517e commit 13a6e6d

File tree

9 files changed

+275
-3
lines changed

9 files changed

+275
-3
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesClientTestSpec.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ private CodeBlock requestCreation(OperationModel opModel, Map<String, TreeNode>
442442

443443
if (opParams != null) {
444444
opParams.forEach((n, v) -> {
445-
MemberModel memberModel = opModel.getInputShape().getMemberByName(n);
445+
MemberModel memberModel = opModel.getInputShape().getMemberByC2jName(n);
446446
CodeBlock memberValue = createMemberValue(memberModel, v);
447447
b.add(".$N($L)", memberModel.getFluentSetterMethodName(), memberValue);
448448
});
@@ -799,7 +799,7 @@ private CodeBlock createModelClass(ShapeModel shapeModel, TreeNode valueNode) {
799799
Iterator<String> fieldNamesIter = obj.fieldNames();
800800
while (fieldNamesIter.hasNext()) {
801801
String fieldName = fieldNamesIter.next();
802-
MemberModel member = shapeModel.getMemberByName(fieldName);
802+
MemberModel member = shapeModel.getMemberByC2jName(fieldName);
803803
JrsValue value = obj.get(fieldName);
804804

805805
b.add(".$N($L)", member.getFluentSetterMethodName(), createMemberValue(member, value));

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesSpecUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ public CodeBlock treeNodeToLiteral(TreeNode treeNode) {
183183
case VALUE_FALSE:
184184
b.add("$L", Validate.isInstanceOf(JrsBoolean.class, treeNode, "Expected boolean").booleanValue());
185185
break;
186+
case START_ARRAY:
187+
handleArrayDefaultValue(b, "stringarray",
188+
Validate.isInstanceOf(JrsArray.class, treeNode, "Expected string array"));
189+
break;
186190
default:
187191
throw new RuntimeException("Don't know how to set default value for parameter of type "
188192
+ treeNode.asToken());

codegen/src/main/resources/software/amazon/awssdk/codegen/rules/GetAttr.java.resource

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,9 @@ public class GetAttr extends Fn {
160160
if (slice < 0) {
161161
throw new InnerParseError("Invalid path component: slice index must be >= 0");
162162
}
163-
result.add(Part.Key.of(component.substring(0, slicePartIndex)));
163+
if (slicePartIndex > 0) {
164+
result.add(Part.Key.of(component.substring(0, slicePartIndex)));
165+
}
164166
result.add(new Part.Index(slice));
165167
} catch (NumberFormatException ex) {
166168
throw new InnerParseError(String.format("%s could not be parsed as a number", slicePart));

codegen/src/test/java/software/amazon/awssdk/codegen/poet/ClientTestModels.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,24 @@ public static IntermediateModel queryServiceModels() {
107107
return new IntermediateModelBuilder(models).build();
108108
}
109109

110+
public static IntermediateModel stringArrayServiceModels() {
111+
File serviceModel = new File(ClientTestModels.class.getResource("client/c2j/stringarray/service-2.json").getFile());
112+
File endpointRuleSetModel =
113+
new File(ClientTestModels.class.getResource("client/c2j/stringarray/endpoint-rule-set.json").getFile());
114+
File endpointTestsModel =
115+
new File(ClientTestModels.class.getResource("client/c2j/stringarray/endpoint-tests.json").getFile());
116+
117+
C2jModels models = C2jModels
118+
.builder()
119+
.serviceModel(getServiceModel(serviceModel))
120+
.customizationConfig(CustomizationConfig.create())
121+
.endpointRuleSetModel(getEndpointRuleSet(endpointRuleSetModel))
122+
.endpointTestSuiteModel(getEndpointTestSuite(endpointTestsModel))
123+
.build();
124+
125+
return new IntermediateModelBuilder(models).build();
126+
}
127+
110128
public static IntermediateModel queryServiceModelsWithOverrideKnowProperties() {
111129
File serviceModel = new File(ClientTestModels.class.getResource("client/c2j/query/service-2.json").getFile());
112130
File customizationModel = new File(ClientTestModels.class.getResource("client/c2j/query/customization-endpoint-know-prop.config").getFile());

codegen/src/test/java/software/amazon/awssdk/codegen/poet/rules/EndpointRulesClientTestSpecTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,10 @@ public void endpointRulesTestClass() {
2828
ClassSpec endpointProviderSpec = new EndpointRulesClientTestSpec(ClientTestModels.queryServiceModels());
2929
assertThat(endpointProviderSpec, generatesTo("endpoint-rules-test-class.java"));
3030
}
31+
32+
@Test
33+
public void endpointProviderTestClassWithStringArray() {
34+
ClassSpec endpointProviderSpec = new EndpointProviderTestSpec(ClientTestModels.stringArrayServiceModels());
35+
assertThat(endpointProviderSpec, generatesTo("endpoint-rules-stringarray-test-class.java"));
36+
}
3137
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"version": "1.0",
3+
"parameters": {
4+
"stringArrayParam": {
5+
"type": "stringArray",
6+
"required": true,
7+
"default": ["defaultValue1", "defaultValue2"],
8+
"documentation": "docs"
9+
}
10+
},
11+
"rules": [
12+
{
13+
"documentation": "Template first array value into URI if set",
14+
"conditions": [
15+
{
16+
"fn": "getAttr",
17+
"argv": [
18+
{
19+
"ref": "stringArrayParam"
20+
},
21+
"[0]"
22+
],
23+
"assign": "arrayValue"
24+
}
25+
],
26+
"endpoint": {
27+
"url": "https://example.com/{arrayValue}"
28+
},
29+
"type": "endpoint"
30+
},
31+
{
32+
"conditions": [],
33+
"documentation": "error fallthrough",
34+
"error": "no array values set",
35+
"type": "error"
36+
}
37+
]
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{
2+
"version": "1.0",
3+
"testCases": [
4+
{
5+
"documentation": "Default array values used",
6+
"params": {},
7+
"expect": {
8+
"endpoint": {
9+
"url": "https://example.com/defaultValue1"
10+
}
11+
},
12+
"operationInputs": [
13+
{
14+
"operationName": "NoBindingsOperation"
15+
}
16+
]
17+
},
18+
{
19+
"documentation": "Empty array",
20+
"params": {
21+
"stringArrayParam": []
22+
},
23+
"expect": {
24+
"error": "no array values set"
25+
},
26+
"operationInputs": [
27+
{
28+
"operationName": "EmptyStaticContextOperation"
29+
}
30+
]
31+
},
32+
{
33+
"documentation": "Static value",
34+
"params": {
35+
"stringArrayParam": ["staticValue1"]
36+
},
37+
"expect": {
38+
"endpoint": {
39+
"url": "https://example.com/staticValue1"
40+
}
41+
},
42+
"operationInputs": [
43+
{
44+
"operationName": "StaticContextOperation"
45+
}
46+
]
47+
},
48+
{
49+
"documentation": "bound value from input",
50+
"params": {
51+
"stringArrayParam": ["key1"]
52+
},
53+
"expect": {
54+
"endpoint": {
55+
"url": "https://example.com/key1"
56+
}
57+
},
58+
"operationInputs": [
59+
{
60+
"operationName": "ListOfObjectsOperation",
61+
"operationParams": {
62+
"nested": {
63+
"listOfObjects": [{"key": "key1"}]
64+
}
65+
}
66+
}
67+
]
68+
}
69+
]
70+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{
2+
"version": "2.0",
3+
"metadata": {
4+
"endpointPrefix": "svcname",
5+
"serviceId": "sample_svc",
6+
"jsonVersion":"1.1",
7+
"protocol":"json",
8+
"signatureVersion": "v4"
9+
},
10+
"operations": {
11+
"NoBindingsOperation": {
12+
"input": { "shape": "EmptyOperationRequest" },
13+
"http": {
14+
"method": "POST",
15+
"requestUri": "/"
16+
}
17+
},
18+
"EmptyStaticContextOperation": {
19+
"input": { "shape": "EmptyOperationRequest" },
20+
"staticContextParams": {
21+
"stringArrayParam": {
22+
"value": []
23+
}
24+
},
25+
"http": {
26+
"method": "POST",
27+
"requestUri": "/"
28+
}
29+
},
30+
"StaticContextOperation": {
31+
"input": { "shape": "EmptyOperationRequest" },
32+
"staticContextParams": {
33+
"stringArrayParam": {
34+
"value": ["staticValue1"]
35+
}
36+
},
37+
"http": {
38+
"method": "POST",
39+
"requestUri": "/"
40+
}
41+
},
42+
"ListOfObjectsOperation": {
43+
"input": { "shape": "ListOfObjectsOperationRequest" },
44+
"operationContextParams": {
45+
"stringArrayParam": {
46+
"path": "nested.listOfObjects[*].key"
47+
}
48+
},
49+
"http": {
50+
"method": "POST",
51+
"requestUri": "/"
52+
}
53+
}
54+
},
55+
"shapes": {
56+
"EmptyOperationRequest": {
57+
"type": "structure",
58+
"members": {}
59+
},
60+
"ListOfObjectsOperationRequest": {
61+
"type": "structure",
62+
"members": {
63+
"nested":{"shape":"Nested"}
64+
}
65+
},
66+
"Nested": {
67+
"type": "structure",
68+
"members": {
69+
"listOfObjects":{"shape":"ListOfObjects"}
70+
}
71+
},
72+
"ListOfObjects": {
73+
"type": "list",
74+
"member":{"shape":"ObjectMember"}
75+
},
76+
"ObjectMember": {
77+
"type": "structure",
78+
"members": {
79+
"key":{"shape":"String"}
80+
}
81+
},
82+
"String":{
83+
"type":"string"
84+
}
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package software.amazon.awssdk.services.samplesvc.endpoints;
2+
3+
import java.net.URI;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.MethodSource;
9+
import software.amazon.awssdk.annotations.Generated;
10+
import software.amazon.awssdk.core.rules.testing.BaseEndpointProviderTest;
11+
import software.amazon.awssdk.core.rules.testing.EndpointProviderTestCase;
12+
import software.amazon.awssdk.core.rules.testing.model.Expect;
13+
import software.amazon.awssdk.endpoints.Endpoint;
14+
15+
@Generated("software.amazon.awssdk:codegen")
16+
public class SampleSvcEndpointProviderTests extends BaseEndpointProviderTest {
17+
private static final SampleSvcEndpointProvider PROVIDER = SampleSvcEndpointProvider.defaultProvider();
18+
19+
@MethodSource("testCases")
20+
@ParameterizedTest
21+
public void resolvesCorrectEndpoint(EndpointProviderTestCase tc) {
22+
verify(tc);
23+
}
24+
25+
private static List<EndpointProviderTestCase> testCases() {
26+
List<EndpointProviderTestCase> testCases = new ArrayList<>();
27+
testCases.add(new EndpointProviderTestCase(() -> {
28+
SampleSvcEndpointParams.Builder builder = SampleSvcEndpointParams.builder();
29+
return PROVIDER.resolveEndpoint(builder.build()).join();
30+
}, Expect.builder().endpoint(Endpoint.builder().url(URI.create("https://example.com/defaultValue1")).build()).build()));
31+
testCases.add(new EndpointProviderTestCase(() -> {
32+
SampleSvcEndpointParams.Builder builder = SampleSvcEndpointParams.builder();
33+
builder.stringArrayParam(Arrays.asList());
34+
return PROVIDER.resolveEndpoint(builder.build()).join();
35+
}, Expect.builder().error("no array values set").build()));
36+
testCases.add(new EndpointProviderTestCase(() -> {
37+
SampleSvcEndpointParams.Builder builder = SampleSvcEndpointParams.builder();
38+
builder.stringArrayParam(Arrays.asList("staticValue1"));
39+
return PROVIDER.resolveEndpoint(builder.build()).join();
40+
}, Expect.builder().endpoint(Endpoint.builder().url(URI.create("https://example.com/staticValue1")).build()).build()));
41+
testCases.add(new EndpointProviderTestCase(() -> {
42+
SampleSvcEndpointParams.Builder builder = SampleSvcEndpointParams.builder();
43+
builder.stringArrayParam(Arrays.asList("key1"));
44+
return PROVIDER.resolveEndpoint(builder.build()).join();
45+
}, Expect.builder().endpoint(Endpoint.builder().url(URI.create("https://example.com/key1")).build()).build()));
46+
return testCases;
47+
}
48+
}

0 commit comments

Comments
 (0)