Skip to content

Commit d759f4a

Browse files
authored
Add support for string array type in endpoint parameter (#3085)
* add support for string array * crt interface hook * fixes * support add stringarray in endpointprovider autogen * fix compiler error * add fixes + test for string array endpoint param * add tests to cmake * test tweak * test tweak * add autogen for specific jmespath field, object projections * codegen updates * add support for keys() smithy expression * tweaks to support jmespath expressions * integrate with existing endpoint resolution * remove stray whitespace * name changes for convention * replace vector in java, fix method name case * header method name case fix * remove unused packages * fix method case * address suggestions * fix cmake * fix whitespace + namespace * fix ws * tweaks * whitespace fixes * fix namespace * remove globals * remove unused vars * moved test to core * changes with stream placeholder * fixes * remove redundant deps * add streams * cleanup stray code * rename test class
1 parent a72c30a commit d759f4a

File tree

20 files changed

+567
-40
lines changed

20 files changed

+567
-40
lines changed

src/aws-cpp-sdk-core/include/aws/core/endpoint/BuiltInParameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace Aws
3333
void SetParameter(EndpointParameter param);
3434
void SetStringParameter(Aws::String name, Aws::String value);
3535
void SetBooleanParameter(Aws::String name, bool value);
36-
36+
void SetStringArrayParameter(Aws::String name, const Aws::Vector<Aws::String>&& value);
3737
const Aws::Vector<EndpointParameter>& GetAllParameters() const;
3838

3939
protected:

src/aws-cpp-sdk-core/include/aws/core/endpoint/ClientContextParameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace Aws
2828
void SetParameter(EndpointParameter param);
2929
void SetStringParameter(Aws::String name, Aws::String value);
3030
void SetBooleanParameter(Aws::String name, bool value);
31+
void SetStringArrayParameter(Aws::String name, const Aws::Vector<Aws::String>& value);
3132

3233
const Aws::Vector<EndpointParameter>& GetAllParameters() const;
3334
protected:

src/aws-cpp-sdk-core/include/aws/core/endpoint/EndpointParameter.h

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ namespace Aws
1919
enum class ParameterType
2020
{
2121
BOOLEAN,
22-
STRING
22+
STRING,
23+
STRING_ARRAY
2324
};
2425
enum class ParameterOrigin
2526
{
@@ -51,6 +52,13 @@ namespace Aws
5152
m_stringValue(initialValue)
5253
{}
5354

55+
EndpointParameter(Aws::String name, const Aws::Vector<Aws::String>& initialValue, ParameterOrigin parameterOrigin = ParameterOrigin::NOT_SET)
56+
: m_storedType(ParameterType::STRING_ARRAY),
57+
m_parameterOrigin(parameterOrigin),
58+
m_name(std::move(name)),
59+
m_stringArrayValue(initialValue)
60+
{}
61+
5462
EndpointParameter(ParameterType storedType, ParameterOrigin parameterOrigin, Aws::String name)
5563
: m_storedType(storedType),
5664
m_parameterOrigin(parameterOrigin),
@@ -100,6 +108,14 @@ namespace Aws
100108
return GetSetResult::SUCCESS;
101109
}
102110

111+
inline GetSetResult GetStringArray(Aws::Vector<Aws::String>& ioValue) const
112+
{
113+
if(m_storedType != ParameterType::STRING_ARRAY)
114+
return GetSetResult::ERROR_WRONG_TYPE;
115+
ioValue = m_stringArrayValue;
116+
return GetSetResult::SUCCESS;
117+
}
118+
103119
inline GetSetResult SetBool(bool iValue)
104120
{
105121
if(m_storedType != ParameterType::BOOLEAN)
@@ -116,6 +132,22 @@ namespace Aws
116132
return GetSetResult::SUCCESS;
117133
}
118134

135+
inline GetSetResult SetStringArray(const Aws::Vector<Aws::String>& iValue)
136+
{
137+
if(m_storedType != ParameterType::STRING_ARRAY)
138+
return GetSetResult::ERROR_WRONG_TYPE;
139+
m_stringArrayValue = iValue;
140+
return GetSetResult::SUCCESS;
141+
}
142+
143+
inline GetSetResult SetStringArray(Aws::Vector<Aws::String>&& iValue)
144+
{
145+
if(m_storedType != ParameterType::STRING_ARRAY)
146+
return GetSetResult::ERROR_WRONG_TYPE;
147+
m_stringArrayValue = std::move(iValue);
148+
return GetSetResult::SUCCESS;
149+
}
150+
119151
bool GetBoolValueNoCheck() const
120152
{
121153
return m_boolValue;
@@ -125,13 +157,19 @@ namespace Aws
125157
return m_stringValue;
126158
}
127159

160+
const Aws::Vector<Aws::String>& GetStrArrayValueNoCheck() const
161+
{
162+
return m_stringArrayValue;
163+
}
164+
128165
protected:
129166
ParameterType m_storedType;
130167
ParameterOrigin m_parameterOrigin;
131168
Aws::String m_name;
132169

133170
bool m_boolValue = false;
134171
Aws::String m_stringValue;
172+
Aws::Vector<Aws::String> m_stringArrayValue;
135173
};
136174

137175
using EndpointParameters = Aws::Vector<Aws::Endpoint::EndpointParameter>;

src/aws-cpp-sdk-core/source/endpoint/BuiltInParameters.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ namespace Endpoint
122122
return SetParameter(EndpointParameter(std::move(name), value, EndpointParameter::ParameterOrigin::BUILT_IN));
123123
}
124124

125+
void BuiltInParameters::SetStringArrayParameter(Aws::String name, const Aws::Vector<Aws::String>&& value)
126+
{
127+
return SetParameter(EndpointParameter(std::move(name), value, EndpointParameter::ParameterOrigin::BUILT_IN));
128+
}
129+
125130
const Aws::Vector<BuiltInParameters::EndpointParameter>& BuiltInParameters::GetAllParameters() const
126131
{
127132
return m_params;

src/aws-cpp-sdk-core/source/endpoint/ClientContextParameters.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ namespace Endpoint
5353
return SetParameter(EndpointParameter(std::move(name), value, EndpointParameter::ParameterOrigin::CLIENT_CONTEXT));
5454
}
5555

56+
void ClientContextParameters::SetStringArrayParameter(Aws::String name, const Aws::Vector<Aws::String>& value)
57+
{
58+
return SetParameter(EndpointParameter(std::move(name), value, EndpointParameter::ParameterOrigin::CLIENT_CONTEXT));
59+
}
60+
5661
const Aws::Vector<ClientContextParameters::EndpointParameter>& ClientContextParameters::GetAllParameters() const
5762
{
5863
return m_params;

src/aws-cpp-sdk-core/source/endpoint/DefaultEndpointProvider.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,27 @@ ResolveEndpointDefaultImpl(const Aws::Crt::Endpoints::RuleEngine& ruleEngine,
138138
AWS_LOGSTREAM_TRACE(DEFAULT_ENDPOINT_PROVIDER_TAG, "Endpoint str eval parameter: " << parameter.GetName() << " = " << parameter.GetStrValueNoCheck());
139139
crtRequestCtx.AddString(Aws::Crt::ByteCursorFromCString(parameter.GetName().c_str()), Aws::Crt::ByteCursorFromCString(parameter.GetStrValueNoCheck().c_str()));
140140
}
141+
else if(EndpointParameter::ParameterType::STRING_ARRAY == parameter.GetStoredType())
142+
{
143+
Aws::Crt::Vector<Aws::Crt::ByteCursor> byteCursorArray;
144+
byteCursorArray.reserve(parameter.GetStrArrayValueNoCheck().size());
145+
for (const auto &e: parameter.GetStrArrayValueNoCheck())
146+
{
147+
byteCursorArray.emplace_back(Aws::Crt::ByteCursorFromCString(e.c_str()));
148+
}
149+
AWS_LOGSTREAM_TRACE(DEFAULT_ENDPOINT_PROVIDER_TAG,
150+
"Endpoint str array eval parameter: " <<
151+
parameter.GetName() << " = " <<
152+
[&parameter]() -> Aws::String {
153+
Aws::OStringStream os;
154+
for (const auto &e: parameter.GetStrArrayValueNoCheck())
155+
{
156+
os<<e<<",";
157+
}
158+
return os.str();
159+
}());
160+
crtRequestCtx.AddStringArray(Aws::Crt::ByteCursorFromCString(parameter.GetName().c_str()), byteCursorArray);
161+
}
141162
else
142163
{
143164
return ResolveEndpointOutcome(

tests/aws-cpp-sdk-core-tests/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ file(GLOB UTILS_COMPONENT_REGISTRY_SRC "${CMAKE_CURRENT_SOURCE_DIR}/utils/compon
2525
file(GLOB MONITORING_SRC "${CMAKE_CURRENT_SOURCE_DIR}/monitoring/*.cpp")
2626
file(GLOB SMITHY_TRACING_SRC "${CMAKE_CURRENT_SOURCE_DIR}/smithy/tracing/*.cpp")
2727
file(GLOB SMITHY_CLIENT_SRC "${CMAKE_CURRENT_SOURCE_DIR}/smithy/client/*.cpp")
28+
file(GLOB ENDPOINT_SRC "${CMAKE_CURRENT_SOURCE_DIR}/endpoint/*.cpp")
2829

2930

3031
file(GLOB AWS_CPP_SDK_CORE_TESTS_SRC
@@ -50,6 +51,7 @@ file(GLOB AWS_CPP_SDK_CORE_TESTS_SRC
5051
${UTILS_RATE_LIMITER_SRC}
5152
${SMITHY_TRACING_SRC}
5253
${SMITHY_CLIENT_SRC}
54+
${ENDPOINT_SRC}
5355
)
5456

5557
if(PLATFORM_WINDOWS)
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
2+
3+
#include <aws/core/endpoint/DefaultEndpointProvider.h>
4+
#include <aws/core/utils/memory/stl/AWSArray.h>
5+
#include <aws/testing/AwsCppSdkGTestSuite.h>
6+
7+
namespace EndpointParamTest{
8+
const size_t RulesBlobSize = 498;
9+
using RulesBlobT = Aws::Array<const char, RulesBlobSize>;
10+
11+
static constexpr RulesBlobT RulesBlob = {{
12+
'{','"','v','e','r','s','i','o','n','"',':','"','1','.','0','"',',','"','p','a','r','a','m','e','t',
13+
'e','r','s','"',':','{','"','s','t','r','i','n','g','A','r','r','a','y','P','a','r','a','m','"',':',
14+
'{','"','t','y','p','e','"',':','"','s','t','r','i','n','g','A','r','r','a','y','"',',','"','r','e',
15+
'q','u','i','r','e','d','"',':','t','r','u','e',',','"','d','e','f','a','u','l','t','"',':','[','"',
16+
'd','e','f','a','u','l','t','V','a','l','u','e','1','"',',','"','d','e','f','a','u','l','t','V','a',
17+
'l','u','e','2','"',']',',','"','d','o','c','u','m','e','n','t','a','t','i','o','n','"',':','"','d',
18+
'o','c','s','"','}','}',',','"','r','u','l','e','s','"',':','[','{','"','d','o','c','u','m','e','n',
19+
't','a','t','i','o','n','"',':','"','T','e','m','p','l','a','t','e',' ','f','i','r','s','t',' ','a',
20+
'r','r','a','y',' ','v','a','l','u','e',' ','i','n','t','o',' ','U','R','I',' ','i','f',' ','s','e',
21+
't','"',',','"','c','o','n','d','i','t','i','o','n','s','"',':','[','{','"','f','n','"',':','"','g',
22+
'e','t','A','t','t','r','"',',','"','a','r','g','v','"',':','[','{','"','r','e','f','"',':','"','s',
23+
't','r','i','n','g','A','r','r','a','y','P','a','r','a','m','"','}',',','"','[','0',']','"',']',',',
24+
'"','a','s','s','i','g','n','"',':','"','a','r','r','a','y','V','a','l','u','e','"','}',']',',','"',
25+
'e','n','d','p','o','i','n','t','"',':','{','"','u','r','l','"',':','"','h','t','t','p','s',':','/',
26+
'/','e','x','a','m','p','l','e','.','c','o','m','/','{','a','r','r','a','y','V','a','l','u','e','}',
27+
'"','}',',','"','t','y','p','e','"',':','"','e','n','d','p','o','i','n','t','"','}',',','{','"','c',
28+
'o','n','d','i','t','i','o','n','s','"',':','[',']',',','"','d','o','c','u','m','e','n','t','a','t',
29+
'i','o','n','"',':','"','e','r','r','o','r',' ','f','a','l','l','t','h','r','o','u','g','h','"',',',
30+
'"','e','r','r','o','r','"',':','"','n','o',' ','a','r','r','a','y',' ','v','a','l','u','e','s',' ',
31+
's','e','t','"',',','"','t','y','p','e','"',':','"','e','r','r','o','r','"','}',']','}','\0'
32+
}};
33+
34+
}
35+
36+
class TestServiceEndpointProviderTest : public Aws::Endpoint::DefaultEndpointProvider<>
37+
{
38+
public:
39+
using TestServiceResolveEndpointOutcome = Aws::Endpoint::ResolveEndpointOutcome;
40+
41+
TestServiceEndpointProviderTest()
42+
: Aws::Endpoint::DefaultEndpointProvider<>(EndpointParamTest::RulesBlob.data(), EndpointParamTest::RulesBlobSize)
43+
{}
44+
45+
~TestServiceEndpointProviderTest()
46+
{
47+
}
48+
};
49+
50+
class EndpointTest : public Aws::Testing::AwsCppSdkGTestSuite {
51+
protected:
52+
static const char ALLOCATION_TAG[];
53+
54+
public:
55+
void SetUp() override{
56+
}
57+
};
58+
const char EndpointTest::ALLOCATION_TAG[] = "EndpointTest";
59+
60+
TEST_F(EndpointTest, testStringArrayParam) {
61+
62+
std::shared_ptr<TestServiceEndpointProviderTest> endpointProvider_sp = Aws::MakeShared<TestServiceEndpointProviderTest>(ALLOCATION_TAG);
63+
64+
Aws::Endpoint::EndpointParameters parameters;
65+
// Static context parameters
66+
parameters.emplace_back(Aws::String("stringArrayParam"), Aws::Vector<Aws::String>{"staticValue2","staticValue1"}, Aws::Endpoint::EndpointParameter::ParameterOrigin::STATIC_CONTEXT);
67+
68+
auto res = endpointProvider_sp->ResolveEndpoint(parameters);
69+
EXPECT_TRUE(res.IsSuccess());
70+
EXPECT_EQ( res.GetResult().GetURL(), "https://example.com/staticValue2");
71+
}
72+
73+
TEST_F(EndpointTest, testStringArrayParamError) {
74+
75+
std::shared_ptr<TestServiceEndpointProviderTest> endpointProvider_sp = Aws::MakeShared<TestServiceEndpointProviderTest>(ALLOCATION_TAG);
76+
77+
Aws::Endpoint::EndpointParameters parameters;
78+
// Static context parameters
79+
parameters.emplace_back(Aws::String("stringArrayParam"), Aws::Vector<Aws::String>{}, Aws::Endpoint::EndpointParameter::ParameterOrigin::STATIC_CONTEXT);
80+
81+
auto res = endpointProvider_sp->ResolveEndpoint(parameters);
82+
83+
EXPECT_FALSE(res.IsSuccess());
84+
}

tools/code-generation/generator/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,15 @@
128128
<artifactId>commons-lang</artifactId>
129129
<version>2.5</version>
130130
</dependency>
131+
<dependency>
132+
<groupId>software.amazon.smithy</groupId>
133+
<artifactId>smithy-jmespath</artifactId>
134+
<version>1.24.0</version>
135+
</dependency>
136+
<dependency>
137+
<groupId>software.amazon.smithy</groupId>
138+
<artifactId>smithy-codegen-core</artifactId>
139+
<version>1.50.0</version>
140+
</dependency>
131141
</dependencies>
132142
</project>

tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/c2j/C2jOperation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class C2jOperation {
2323
private List<C2jError> errors;
2424
private String documentation;
2525
private Map<String, Map<String, EndpointParameterValue>> staticContextParams;
26+
//operation context params
27+
private Map<String, Map<String, String>> operationContextParams;
2628
private boolean deprecated;
2729
private boolean httpChecksumRequired;
2830
private C2jHttpChecksum httpChecksum;

0 commit comments

Comments
 (0)