feat(hos_client_create, hos_client_destory): 多次调用destory不会导致重复释放

This commit is contained in:
彭宣正
2020-12-14 17:24:58 +08:00
parent 505d529c32
commit 10b370e486
55976 changed files with 8544395 additions and 2 deletions

View File

@@ -0,0 +1,149 @@
Apache License
Version 2.0, January 2004
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
2. You must cause any modified files to carry prominent notices stating that You changed the files; and
3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
Note: Other license terms may apply to certain, identified software files contained within or distributed with the accompanying software if such terms are included in the directory containing the accompanying software. Such other license terms will then apply in lieu of the terms of the software license above.
JSON processing code subject to the MIT License from http://en.wikipedia.org/wiki/MIT_License
XML processing code is subject to the license at (www.grinninglizard.com)
Android build logic code is subject to the MIT License from http://en.wikipedia.org/wiki/MIT_License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
The Software shall be used for Good, not Evil.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Eclipse Public License - v 1.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
"Program" means the Contributions distributed in accordance with this Agreement.
"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the Program.
Contributors may not remove or alter any copyright notices contained within the Program.
Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
The MIT License (MIT)
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,19 @@
AWS SDK for C++
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
This product includes software developed by
Amazon Technologies, Inc (http://www.amazon.com/).
**********************
THIRD PARTY COMPONENTS
**********************
This software includes third party software subject to the following copyrights:
- Maven for building the Client Generator - APACHE LICENSE, VERSION 2.0
- Velocity for templating in the Client Generator - APACHE LICENSE, VERSION 2.0
- Gson for json parsing in the Client Generator - Google
- Guava for general Java utilities for the Client Generator- Doug Lea
- Lombok general Java utilities for the Client Generator- Reinier Zwitserloot
- Mockito unit test mocking framework for testing the Client Generator- Szczepan Faber, Brice Dutheil
- Junit - Eclipse License
The licenses for these third party components are included in LICENSE.txt

View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.amazonaws</groupId>
<artifactId>aws-client-generator</artifactId>
<version>1.0-SNAPSHOT</version>
<name>AWS Client Generator</name>
<url>http://aws.amazon.com</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.amazonaws.util.awsclientgenerator.main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.amazonaws.util.awsclientgenerator.main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.1.1-jre</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!--Dependicies for lambda function-->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1 @@
Feel free to delete this file as soon as actual Java code is added to this directory.

View File

@@ -0,0 +1,20 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@AllArgsConstructor
@EqualsAndHashCode
public class SdkSpec {
String languageBinding;
String serviceName;
String version;
}

View File

@@ -0,0 +1,85 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.config;
import com.amazonaws.util.awsclientgenerator.SdkSpec;
import com.amazonaws.util.awsclientgenerator.config.exceptions.GeneratorNotImplementedException;
import com.amazonaws.util.awsclientgenerator.generators.ClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.QueryCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.RestXmlCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.apigateway.APIGatewayRestJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.apigatewayv2.APIGatewayV2RestJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.cloudfront.CloudfrontCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.dynamodb.DynamoDBJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.ec2.Ec2CppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.glacier.GlacierRestJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.lambda.LambdaRestJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.machinelearning.MachineLearningJsonCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.polly.PollyCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.rds.RDSCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.s3.S3RestXmlCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.s3control.S3ControlRestXmlCppClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.cpp.sqs.SQSQueryXmlCppClientGenerator;
import java.util.HashMap;
import java.util.Map;
public class ServiceGeneratorConfig {
static final Map<String, ClientGenerator> LANGUAGE_PROTOCOL_DEFAULT_MAPPING = new HashMap<>();
static final Map<String, ClientGenerator> SPEC_OVERRIDE_MAPPING = new HashMap<>();
static {
try {
LANGUAGE_PROTOCOL_DEFAULT_MAPPING.put("cpp-json", new JsonCppClientGenerator());
LANGUAGE_PROTOCOL_DEFAULT_MAPPING.put("cpp-rest-json", new JsonCppClientGenerator());
LANGUAGE_PROTOCOL_DEFAULT_MAPPING.put("cpp-application-json", new JsonCppClientGenerator());
LANGUAGE_PROTOCOL_DEFAULT_MAPPING.put("cpp-rest-xml", new RestXmlCppClientGenerator());
LANGUAGE_PROTOCOL_DEFAULT_MAPPING.put("cpp-query", new QueryCppClientGenerator());
} catch (Exception e) {
e.printStackTrace();
}
}
static {
try {
SPEC_OVERRIDE_MAPPING.put("cpp-dynamodb", new DynamoDBJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-glacier", new GlacierRestJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-lambda", new LambdaRestJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-sqs", new SQSQueryXmlCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-s3", new S3RestXmlCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-s3control", new S3ControlRestXmlCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-cloudfront", new CloudfrontCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-ec2", new Ec2CppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-apigateway", new APIGatewayRestJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-apigatewayv2", new APIGatewayV2RestJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-machinelearning", new MachineLearningJsonCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-polly", new PollyCppClientGenerator());
SPEC_OVERRIDE_MAPPING.put("cpp-rds", new RDSCppClientGenerator());
} catch (Exception e) {
e.printStackTrace();
}
}
public static ClientGenerator findGenerator(final SdkSpec spec, final String protocol)
throws GeneratorNotImplementedException {
ClientGenerator generator = SPEC_OVERRIDE_MAPPING.get(String.format("%s-%s", spec.getLanguageBinding(), spec.getServiceName()));
if (generator == null) {
generator = LANGUAGE_PROTOCOL_DEFAULT_MAPPING.get(spec.getLanguageBinding() + "-" + protocol);
}
if(generator == null) {
throw new GeneratorNotImplementedException(
String.format("No generator for Spec: %s protocol: %s", spec, protocol));
}
return generator;
}
}

View File

@@ -0,0 +1,13 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.config.exceptions;
public class GeneratorNotImplementedException extends Exception {
public GeneratorNotImplementedException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,15 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels;
import lombok.Data;
@Data
public class SdkFileEntry {
private StringBuffer sdkFile;
private String pathRelativeToRoot;
private boolean needsByteOrderMark;
}

View File

@@ -0,0 +1,13 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jEndpoint {
private String hostPrefix;
}

View File

@@ -0,0 +1,13 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jEndpointDiscovery {
private boolean required;
}

View File

@@ -0,0 +1,15 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jError extends C2jShapeMember {
private boolean exception;
private boolean fault;
private C2jErrorInfo error;
}

View File

@@ -0,0 +1,15 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jErrorInfo {
private String code;
private int httpStatusCode;
private boolean senderFault;
}

View File

@@ -0,0 +1,15 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jHttp {
private String method;
private String requestUri;
private String responseCode;
}

View File

@@ -0,0 +1,27 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jMetadata {
private String apiVersion;
private String endpointPrefix;
private String globalEndpoint;
private String jsonVersion;
private String serviceAbbreviation;
private String serviceFullName;
private String signatureVersion;
private String signingName;
private String targetPrefix;
private String protocol;
private String clientProjectName;
private String clientClassNamePrefix;
private String uid;
private String timestampFormat;
private String serviceId;
}

View File

@@ -0,0 +1,31 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
import java.lang.*;
import java.util.List;
@Data
public class C2jOperation {
private String name;
private String authtype;
private String authorizer;
private C2jHttp http;
private C2jShapeMember input;
private C2jShapeMember output;
private List<C2jError> errors;
private String documentation;
private boolean deprecated;
private boolean httpChecksumRequired;
// For HostPrefixInjection
private C2jEndpoint endpoint; // endpoint trait
// For Cellular Request Routing
private boolean endpointoperation; // endpointoperation trait
private C2jEndpointDiscovery endpointdiscovery; //endpointdiscovery trait
}

View File

@@ -0,0 +1,20 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
import java.util.Map;
@Data
public class C2jServiceModel {
String version;
C2jMetadata metadata;
String documentation;
Map<String, C2jShape> shapes;
Map<String, C2jOperation> operations;
String serviceName;
}

View File

@@ -0,0 +1,37 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class C2jShape {
private String type;
private List<String> required;
@SerializedName(value = "enum")
private List<String> enums;
private Map<String, C2jShapeMember> members;
private C2jShapeMember member;
private C2jShapeMember key;
private C2jShapeMember value;
private C2jXmlNamespace xmlNamespace;
private String max;
private String min;
private String documentation;
private String locationName;
private String payload;
private boolean flattened;
private C2jErrorInfo error;
private boolean exception;
private String timestampFormat;
private boolean eventstream;
private boolean event;
private boolean sensitive;
}

View File

@@ -0,0 +1,26 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jShapeMember {
String shape;
boolean idempotencyToken;
boolean streaming;
String documentation;
String location;
String locationName;
String queryName;
C2jXmlNamespace xmlNamespace;
boolean deprecated;
boolean flattened;
boolean eventpayload;
boolean hostLabel;
boolean endpointdiscoveryid;
boolean xmlAttribute;
}

View File

@@ -0,0 +1,14 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.c2j;
import lombok.Data;
@Data
public class C2jXmlNamespace {
private String prefix;
private String uri;
}

View File

@@ -0,0 +1,54 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Data
public class Endpoint {
private static final Pattern MEMBER_PATTERN = Pattern.compile("\\{[\\w\\d]+\\}");
private String hostPrefix;
public List<String> getHostPrefixParts() {
// use -1 for split so as to easily construct endpoint string sequentially.
// because there will always be one more item than member-references
// See EndpointTest.java
return Arrays.asList(hostPrefix.split("\\{[\\w\\d]+\\}", -1));
}
public List<String> getMemberReferences() {
List<String> paramList = new LinkedList<>();
Matcher matcher = MEMBER_PATTERN.matcher(hostPrefix);
while (matcher.find()) {
paramList.add(hostPrefix.substring(matcher.start() + 1, matcher.end() - 1));
}
return paramList;
}
public String constructHostPrefixString(String memberPrefix) {
String ret = "";
List<String> parts = getHostPrefixParts();
List<String> members = getMemberReferences();
// {var1}-{var2}.123.{var3}, with prefix to be "Reqeust"
//-> Request.Getvar1() + "-" + Request.Getvar2() + ".123." + Request.Getvar3()
for (int i = 0; i < members.size(); i++)
{
ret += "\"" + parts.get(i) + "\" + " + memberPrefix + ".Get" + members.get(i) + "() + ";
}
ret += "\"" + parts.get(parts.size() - 1) + "\"";
return ret;
}
}

View File

@@ -0,0 +1,23 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(of={"name"})
public class Error {
private String name;
private String text;
private String documentation;
private boolean exception;
private boolean fault;
private boolean isRetryable;
private boolean isCoreError;
private boolean isModeled;
}

View File

@@ -0,0 +1,53 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Data
public class Http {
private static final Pattern URI_PARAM_PATTERN = Pattern.compile(".*\\{[\\w\\d-]+\\}");
private String method;
private String requestUri;
private String responseCode;
public List<String> getRequestUriParts() {
String sanitizedUri = requestUri.replace("+", "");
return Arrays.asList(sanitizedUri.split("\\{[\\w\\d-]+\\}"));
}
public List<String> getRequestParameters() {
String sanitizedUri = requestUri.replace("+", "");
String[] parts = sanitizedUri.split("/|\\?|&");
List<String> paramList = new LinkedList<>();
for (String part : parts) {
Matcher matcher = URI_PARAM_PATTERN.matcher(part);
if (matcher.matches()) {
paramList.add(part.substring(part.indexOf("{") + 1, part.indexOf("}")));
}
}
return paramList;
}
public List<String> splitUriPartIntoPathAndQuery(String requestUri) {
String[] pathAndQuery = requestUri.split("\\?", -1);
if (pathAndQuery.length != 2) {
throw new IllegalArgumentException("Unexpected number of question marks in the request URI, one and only one is expected.");
}
pathAndQuery[1] = "?" + pathAndQuery[1];
return Arrays.asList(pathAndQuery);
}
}

View File

@@ -0,0 +1,40 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import java.util.Map;
@Data
public class Metadata {
private String apiVersion;
private String concatAPIVersion;
private String endpointPrefix;
private String globalEndpoint;
private String jsonVersion;
private String namespace;
private String serviceFullName;
private String signatureVersion;
private String signingName;
private String targetPrefix;
private String protocol;
private String projectName;
private String classNamePrefix;
private String acceptHeader;
private String timestampFormat;
private Map<String, String> additionalHeaders;
private boolean standalone;
private boolean apigateway;
private String serviceId;
// For Host Prefix Injection
private boolean hasEndpointTrait;
// For Cellular Request Routing
private boolean hasEndpointDiscoveryTrait;
private String endpointOperationName;
}

View File

@@ -0,0 +1,43 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import java.util.List;
@Data
public class Operation {
private String name;
private Http http;
private ShapeMember request;
private ShapeMember result;
private List<Error> errors;
private String documentation;
private boolean supportsPresigning;
private boolean virtualAddressAllowed;
private String virtualAddressMemberName;
private boolean arnEndpointAllowed;
private String arnEndpointMemberName;
private boolean hasAccountIdInHostname;
private String accountIdMemberName;
private String authtype;
private String authorizer;
private boolean eventStream;
// For Host Prefix Injection.
private boolean hasEndpointTrait;
private Endpoint endpoint;
// For Cellular Request Routing
private boolean isEndpointOperation;
private boolean hasEndpointDiscoveryTrait;
private boolean requireEndpointDiscovery;
public boolean hasEndpointDiscoveryTrait() {
return hasEndpointDiscoveryTrait;
}
}

View File

@@ -0,0 +1,47 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.*;
import java.util.stream.Collectors;
@Data
public class ServiceModel {
String version;
String runtimeMajorVersion;
String runtimeMajorVersionUpperBound;
String runtimeMinorVersion;
String namespace;
String serviceName;
Metadata metadata;
String documentation;
String licenseText;
Map<String, Shape> shapes;
Map<String, Operation> operations;
boolean enableVirtualOperations;
Collection<Error> serviceErrors;
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
Set<String> inputShapes = new HashSet<>();
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
Set<String> outputShapes = new HashSet<>();
public boolean hasStreamingRequestShapes() {
return shapes.values().parallelStream().anyMatch(shape -> shape.isRequest() && (shape.hasStreamMembers() || shape.hasEventStreamMembers()));
}
public Collection<Error> getNonCoreServiceErrors() {
return serviceErrors.stream().filter(e -> !e.isCoreError()).collect(Collectors.toSet());
}
}

View File

@@ -0,0 +1,215 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.HashSet;
import java.util.Optional;
@Data
public class Shape {
private String name;
private String type;
private List<String> enumValues;
private HashSet<String> referencedBy;
private Map<String, ShapeMember> members;
private ShapeMember listMember;
private ShapeMember mapKey;
private ShapeMember mapValue;
private ShapeMember customizedQuery;
private String max;
private String min;
private String documentation;
private String locationName;
private String payload;
private XmlNamespace xmlNamespace;
private boolean isRequest;
private boolean isResult;
private boolean isReferenced;
private boolean flattened;
private boolean computeContentMd5;
private boolean supportsPresigning;
private boolean signBody;
private String signerName;
private String timestampFormat;
private boolean eventStream;
private boolean event;
private boolean exception;
private boolean sensitive;
public boolean isMap() {
return "map".equals(type.toLowerCase());
}
public boolean isList() {
return "list".equals(type.toLowerCase());
}
public boolean isStructure() {
return "structure".equals(type.toLowerCase());
}
public boolean isDouble() { return "double".equals(type.toLowerCase()); }
public boolean isString() {
return "string".equals(type.toLowerCase()) && !isEnum();
}
public boolean isTimeStamp() {
return "timestamp".equals(type.toLowerCase());
}
public boolean isEnum() {
return enumValues != null && enumValues.size() > 0;
}
public boolean isBlob() {
return "blob".equals(type.toLowerCase());
}
public boolean isBoolean() {
return "boolean".equals(type.toLowerCase());
}
public boolean isPrimitive() {
return !isMap() && !isList() && !isStructure() && !isString() && !isEnum() && !isBlob() && !isTimeStamp();
}
public boolean isXmlModeledException() {
if (!exception) return false;
return members.keySet().parallelStream().anyMatch(key -> !key.equals("Message") && !key.equals("message") && !key.equals("Code") && !key.equals("code"));
}
public boolean isJsonModeledException() {
if (!exception) return false;
return members.keySet().parallelStream().anyMatch(key -> !key.equals("Message") && !key.equals("message"));
}
public boolean isMemberRequired(String member) {
ShapeMember shapeMember = members.get(member);
return shapeMember != null && members.get(member).isRequired();
}
public boolean hasHeaderMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.isUsedForHeader());
}
public boolean hasStatusCodeMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.isUsedForHttpStatusCode());
}
public boolean hasStreamMembers() {
if (members == null) return false;
return members.values().parallelStream()
.anyMatch(member -> member.isStreaming()) || (payload != null && members.get(payload) != null && !members.get(payload).getShape().isStructure() && !members.get(payload).getShape().isList());
}
public boolean hasPayloadMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> !member.isUsedForHttpStatusCode() && !member.isUsedForHeader()
&& !member.isStreaming() && !member.isUsedForUri() && !member.isUsedForQueryString());
}
public boolean hasQueryStringMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.getLocation() != null && member.getLocation().equalsIgnoreCase("querystring"));
}
public boolean hasBlobMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.getShape().isBlob());
}
public boolean hasEventStreamMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.getShape().isEventStream());
}
public boolean hasEventPayloadMembers() {
if (members == null) return false;
return members.values().parallelStream().anyMatch(member -> member.isEventPayload());
}
public boolean hasAccountIdMembers() {
return members.keySet().stream().anyMatch(key -> key.equals("AccountId"));
}
public ShapeMember getMemberByLocationName(String locationName) {
Optional<ShapeMember> found =
members.values().parallelStream().filter(member -> member.getLocationName() != null && locationName.equals(member.getLocationName())).findFirst();
if(found.isPresent()) {
return found.get();
}
return null;
}
public String getMemberNameByLocationName(String locationName) {
Optional<Map.Entry<String, ShapeMember>> found =
members.entrySet().parallelStream().filter(member ->
locationName.equals(member.getValue().getLocationName())).findFirst();
if(found.isPresent()) {
return found.get().getKey();
}
return null;
}
public Map<String, ShapeMember> getQueryStringMembers() {
Map<String, ShapeMember> queryStringMembers = new LinkedHashMap<>();
for(Map.Entry<String, ShapeMember> entry : members.entrySet()) {
if(entry.getValue().getLocation() != null && entry.getValue().getLocation().equalsIgnoreCase("querystring")){
queryStringMembers.put(entry.getKey(), entry.getValue());
}
}
return queryStringMembers;
}
public void RemoveMember(String memberName) {
members.remove(memberName);
}
@Override
public String toString() {
if(name != null && type != null) {
return String.format("Shape: Name %s Type %s, flattened %b", name, type, flattened);
}
return "null";
}
public boolean hasNestedEventPayloadMembers() {
if (members == null) return false;
// some shapes have a circular graph (e.g. cost-explorer service)
// so we can't simply call hasNestedEventPayloadMembers recursively
return members.values().parallelStream().anyMatch(member -> member.isEventPayload() || member.shape.hasEventPayloadMembers());
}
// Some shapes are mutually referenced with each other, e.g. Statement and NotStatement in wafv2.
public boolean isMutuallyReferencedWith(Shape shape) {
if (shape == null || shape.members == null || members == null || !isStructure() || !shape.isStructure() || name.equals(shape.getName())) return false;
return members.values().parallelStream().anyMatch(member -> member.getShape().getName().equals(shape.getName()))
&& shape.getMembers().values().parallelStream().anyMatch(member -> member.getShape().getName().equals(name));
}
// e.g. "StructValue" has a list of "Value"s as its member, and "StructValue" itself is a member of "Value".
// Then "Value".isListMemberAndMutuallyReferencedWith("StructValue") = true
public boolean isListMemberAndMutuallyReferencedWith(Shape shape) {
if (shape == null || shape.members == null || members == null || !isStructure() || !shape.isStructure() || name.equals(shape.getName())) return false;
return members.values().parallelStream().anyMatch(member -> member.getShape().getName().equals(shape.getName()))
&& shape.getMembers().values().parallelStream().anyMatch(member -> member.getShape().isList() && member.getShape().getListMember().getShape().getName().equals(name));
}
}

View File

@@ -0,0 +1,56 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
@Data
public class ShapeMember {
Shape shape;
boolean idempotencyToken;
//This field has be set to false for all shape members for serialization purposes to do HasBeenSet.
//Right now we need the real value of this field to do parameter validation before sending out the request.
//It's preferred to use this value but it appears in multiple places. Change current value 'false' to it's 'real value' is risky.
//It's safer to copy it's value to another variable (now isValidationNeeded) and validate based on that.
boolean isRequired;
boolean isValidationNeeded;
boolean streaming;
String documentation;
String location;
String locationName;
String queryName;
XmlNamespace xmlNamespace;
boolean isFlattened;
boolean isCustomizedQuery;
boolean isEventPayload;
boolean hostLabel;
boolean endpointDiscoveryId;
boolean xmlAttribute;
public boolean isUsedForHeader() {
return "header".equals(location) || "headers".equals(location);
}
public boolean isUsedForUri() {
return "uri".equals(location);
}
public boolean isUsedForHttpStatusCode() {
return "statusCode".equals(location);
}
public boolean isUsedForQueryString() {
return "querystring".equals(location);
}
public boolean isUsedForPayload() {
return !isUsedForHeader() && !isUsedForUri() && !isUsedForHttpStatusCode() && !isUsedForQueryString() && !streaming;
}
public boolean requiresHeaderEncoding() {
return isUsedForHeader() && "x-amz-copy-source".equals(locationName);
}
}

View File

@@ -0,0 +1,14 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration;
import lombok.Data;
@Data
public class XmlNamespace {
private String prefix;
private String uri;
}

View File

@@ -0,0 +1,41 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import lombok.Data;
import java.util.Set;
@Data
public class CppShapeInformation {
private final Shape shape;
private final ServiceModel serviceModel;
private final String className;
private final String jsonType = "Aws::Utils::Json::JsonValue";
private final String jsonViewType = "Aws::Utils::Json::JsonView";
private final String xmlDocType = "Aws::Utils::Xml::XmlDocument";
private final String xmlNodeType = "Aws::Utils::Xml::XmlNode";
private final String exportValue;
private final String cppType;
private final Set<String> headerIncludes;
private final Set<String> sourceIncludes;
private final String baseClass;
private final String requestContentType;
public CppShapeInformation(final Shape shape, final ServiceModel serviceModel) {
this.shape = shape;
this.serviceModel = serviceModel;
className = shape.getName();
exportValue = CppViewHelper.computeExportValue(serviceModel.getMetadata().getClassNamePrefix());
cppType = CppViewHelper.computeCppType(shape);
headerIncludes = CppViewHelper.computeHeaderIncludes(serviceModel.getMetadata().getProjectName(), shape);
sourceIncludes = CppViewHelper.computeSourceIncludes(serviceModel.getMetadata().getProjectName(), shape);
baseClass = CppViewHelper.computeBaseClass(serviceModel.getMetadata().getClassNamePrefix(), shape);
requestContentType = CppViewHelper.computeRequestContentType(serviceModel.getMetadata());
}
}

View File

@@ -0,0 +1,346 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Metadata;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.transform.CoreErrors;
import com.google.common.base.CaseFormat;
import java.lang.RuntimeException;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.stream.Collectors;
public class CppViewHelper {
private static final Map<String, String> CORAL_TYPE_TO_CPP_TYPE_MAPPING = new HashMap<>();
private static final Map<String, String> CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING = new HashMap<>();
private static final Map<String, String> CORAL_TYPE_TO_XML_CONVERSION_MAPPING = new HashMap<>();
private static final Map<String, String> CORAL_TYPE_TO_DEFAULT_VALUES = new HashMap<>();
private static final Map<String, String> CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING = new HashMap<>();
private static final Map<String, String> CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING = new HashMap<>();
static {
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("long", "long long");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("integer", "int");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("string", "Aws::String");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("timestamp", "Aws::Utils::DateTime");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("boolean", "bool");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("double", "double");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("float", "double");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("blob", "Aws::Utils::ByteBuffer");
CORAL_TYPE_TO_CPP_TYPE_MAPPING.put("sensitive_blob", "Aws::Utils::CryptoBuffer");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("long", "Int64");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("integer", "Integer");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("string", "String");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("boolean", "Bool");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("double", "Double");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("map", "Object");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("list", "Array");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("structure", "Object");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("blob", "String");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("float", "Double");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("timestamp", "Double");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("unixtimestamp", "Double");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("rfc822", "String");
CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.put("iso8601", "String");
CORAL_TYPE_TO_XML_CONVERSION_MAPPING.put("long", "StringUtils::ConvertToInt64");
CORAL_TYPE_TO_XML_CONVERSION_MAPPING.put("integer", "StringUtils::ConvertToInt32");
CORAL_TYPE_TO_XML_CONVERSION_MAPPING.put("boolean", "StringUtils::ConvertToBool");
CORAL_TYPE_TO_XML_CONVERSION_MAPPING.put("double", "StringUtils::ConvertToDouble");
CORAL_TYPE_TO_XML_CONVERSION_MAPPING.put("float", "StringUtils::ConvertToDouble");
CORAL_TYPE_TO_DEFAULT_VALUES.put("long", "0");
CORAL_TYPE_TO_DEFAULT_VALUES.put("integer", "0");
CORAL_TYPE_TO_DEFAULT_VALUES.put("boolean", "false");
CORAL_TYPE_TO_DEFAULT_VALUES.put("double", "0.0");
CORAL_TYPE_TO_DEFAULT_VALUES.put("float", "0.0");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("json", "Aws::AMZN_JSON_CONTENT_TYPE_1_1");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("json1.0", "Aws::AMZN_JSON_CONTENT_TYPE_1_0");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("json1.1", "Aws::AMZN_JSON_CONTENT_TYPE_1_1");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("rest-json", "Aws::AMZN_JSON_CONTENT_TYPE_1_1");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("rest-json1.0", "Aws::AMZN_JSON_CONTENT_TYPE_1_0");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("rest-json1.1", "Aws::AMZN_JSON_CONTENT_TYPE_1_1");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("rest-xml", "Aws::AMZN_XML_CONTENT_TYPE");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("query", "Aws::FORM_CONTENT_TYPE");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("ec2", "Aws::FORM_CONTENT_TYPE");
CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.put("application-json", "Aws::JSON_CONTENT_TYPE");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("json", "json");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("rest-json", "json");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("rest-xml", "xml");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("query", "xml");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("ec2", "xml");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("application-json", "json");
CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.put("api-gateway", "json");
}
public static String computeExportValue(String classNamePrefix) {
return String.format("AWS_%s_API", classNamePrefix.toUpperCase());
}
public static String computeBaseClass(String classNamePrefix, Shape shape) {
String streamingName = shape.hasStreamMembers() ? "Streaming" : "";
return String.format("%s%sRequest", streamingName, classNamePrefix);
}
public static String computeMemberVariableName(String memberName) {
String varName = memberName.substring(0, 1).toLowerCase() + memberName.substring(1);
return String.format("m_%s", varName);
}
public static String computeDefaultValue(Shape shape) {
return CORAL_TYPE_TO_DEFAULT_VALUES.get(shape.getType());
}
public static String computeVariableName(String memberName) {
return memberName.substring(0, 1).toLowerCase() + memberName.substring(1);
}
public static String convertToUpperCamel(String lowerCamel) {
return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, lowerCamel);
}
public static String computeVariableHasBeenSetName(String memberName) {
return String.format("%sHasBeenSet", computeMemberVariableName(memberName));
}
public static String computeJsonizeString(Shape shape) {
String jsonizeString = ".Jsonize()";
if(shape.isStructure()) {
return jsonizeString;
}
if(shape.isTimeStamp()) {
if(shape.getTimestampFormat() == null || CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.get(shape.getTimestampFormat().toLowerCase()).equalsIgnoreCase("Double")) {
return ".SecondsWithMSPrecision()";
}
if(shape.getTimestampFormat().toLowerCase().equalsIgnoreCase("rfc822")) {
return ".ToGmtString(DateFormat::RFC822)";
}
if(shape.getTimestampFormat().toLowerCase().equalsIgnoreCase("iso8601")) {
return ".ToGmtString(DateFormat::ISO_8601)";
}
}
return "";
}
public static String computeCppType(Shape shape) {
String sensitivePrefix = shape.isSensitive() ? "sensitive_" : "";
String cppType = CORAL_TYPE_TO_CPP_TYPE_MAPPING.get(sensitivePrefix + shape.getType());
//enum types show up as string
if(cppType != null && !shape.isEnum()) {
return cppType;
}
else if(shape.isStructure() || shape.isEnum())
{
return shape.getName();
}
else if(shape.isList()) {
String type = computeCppType(shape.getListMember().getShape());
return String.format("Aws::Vector<%s>", type);
}
else if(shape.isMap()) {
String key = computeCppType(shape.getMapKey().getShape());
String value = computeCppType(shape.getMapValue().getShape());
return String.format("Aws::Map<%s, %s>", key, value);
}
else {
return "Aws::String";
}
}
public static String computeJsonCppType(Shape shape) {
if(shape.isTimeStamp() && shape.getTimestampFormat() != null) {
return CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.get(shape.getTimestampFormat().toLowerCase());
}
return CORAL_TYPE_TO_JSON_CPP_TYPE_MAPPING.get(shape.getType());
}
public static String computeXmlConversionMethodName(Shape shape) {
return CORAL_TYPE_TO_XML_CONVERSION_MAPPING.get(shape.getType());
}
public static String computeRequestContentType(Metadata metadata) {
String protocolAndVersion = metadata.getProtocol();
if(metadata.getJsonVersion() != null) {
protocolAndVersion += metadata.getJsonVersion();
}
return CORAL_PROTOCOL_TO_CONTENT_TYPE_MAPPING.get(protocolAndVersion);
}
public static String computeServicePayloadType(String protocol) {
return CORAL_PROTOCOL_TO_PAYLOAD_TYPE_MAPPING.get(protocol);
}
public static Set<String> computeHeaderIncludes(String projectName, Shape shape) {
Set<String> headers = new LinkedHashSet<>();
Set<String> visited = new LinkedHashSet<>();
Queue<Shape> toVisit = shape.getMembers().values().stream().map(ShapeMember::getShape).collect(Collectors.toCollection(() -> new LinkedList<>()));
boolean includeUtilityHeader = false;
boolean includeAWSVectorHeader = false;
while(!toVisit.isEmpty()) {
Shape next = toVisit.remove();
visited.add(next.getName());
if(next.isMap()) {
if(!visited.contains(next.getMapKey().getShape().getName())) {
toVisit.add(next.getMapKey().getShape());
}
if(!visited.contains(next.getMapValue().getShape().getName())) {
toVisit.add(next.getMapValue().getShape());
}
}
if(next.isList())
{
if(!visited.contains(next.getListMember().getShape().getName()))
{
toVisit.add(next.getListMember().getShape());
}
}
if(!next.isPrimitive()) {
if(next.isMutuallyReferencedWith(shape)) {
includeAWSVectorHeader = true;
}
if(!next.isListMemberAndMutuallyReferencedWith(shape)) {
headers.add(formatModelIncludeName(projectName, next));
}
if(next.getMembers() != null) {
// If shapeA.isListMemberAndMutuallyReferencedWith(shapeB) == true, then includes shapeA everywhere includes shapeB in the header files.
next.getMembers().values().stream().map(ShapeMember::getShape).filter(memberShape -> memberShape.isList() && memberShape.getListMember().getShape().isListMemberAndMutuallyReferencedWith(next) && memberShape.getListMember().getShape().getName() != shape.getName()).forEach(listMemberShape -> headers.add(formatModelIncludeName(projectName, listMemberShape.getListMember().getShape())));
}
includeUtilityHeader = true;
}
}
if(includeUtilityHeader) {
headers.add("<utility>");
}
if(includeAWSVectorHeader) {
headers.add("<aws/core/utils/memory/stl/AWSVector.h>");
}
headers.addAll(shape.getMembers().values().stream().filter(member -> member.isIdempotencyToken()).map(member -> "<aws/core/utils/UUID.h>").collect(Collectors.toList()));
return headers;
}
public static String formatModelIncludeName(String projectName, Shape shape) {
if(shape.isMap()) {
return "<aws/core/utils/memory/stl/AWSMap.h>";
}
else if(shape.isList()) {
return "<aws/core/utils/memory/stl/AWSVector.h>";
}
else if(shape.isEnum() || shape.isStructure()) {
return String.format("<aws/%s/model/%s.h>", projectName, shape.getName());
}
else if(shape.isString()) {
return "<aws/core/utils/memory/stl/AWSString.h>";
}
else if(shape.isTimeStamp()) {
return "<aws/core/utils/DateTime.h>";
}
else if(shape.isBlob()) {
return "<aws/core/utils/Array.h>";
}
else {
throw new RuntimeException("Unexpected shape:" + shape.toString());
}
}
public static Set<String> computeSourceIncludes(String projectName, Shape shape) {
Set<String> headers = new LinkedHashSet<>();
Set<String> visited = new LinkedHashSet<>();
Queue<Shape> toVisit = shape.getMembers().values().stream().map(ShapeMember::getShape).collect(Collectors.toCollection(() -> new LinkedList<>()));
while(!toVisit.isEmpty()) {
Shape next = toVisit.remove();
visited.add(next.getName());
if(next.isMap()) {
if(!visited.contains(next.getMapKey().getShape().getName())) {
toVisit.add(next.getMapKey().getShape());
}
if(!visited.contains(next.getMapValue().getShape().getName())) {
toVisit.add(next.getMapValue().getShape());
}
}
if(next.isList())
{
if(!visited.contains(next.getListMember().getShape().getName()))
{
toVisit.add(next.getListMember().getShape());
}
}
if(!next.isPrimitive() && next.isListMemberAndMutuallyReferencedWith(shape)) {
headers.add(formatModelIncludeName(projectName, next));
}
}
for(Map.Entry<String, ShapeMember> entry : shape.getMembers().entrySet()) {
Shape innerShape = entry.getValue().getShape();
// if the shape is a blob, list of blobs or a map with a value blob. It's very unlikely that a blob would be
// the key in a map, but we check it anyways.
if (innerShape.isBlob() ||
(innerShape.isList() && innerShape.getListMember().getShape().isBlob()) ||
(innerShape.isMap() && innerShape.getMapValue().getShape().isBlob()) ||
(innerShape.isMap() && innerShape.getMapKey().getShape().isBlob())) {
headers.add("<aws/core/utils/HashingUtils.h>");
}
else if(entry.getValue().isUsedForHeader() || entry.getValue().isUsedForQueryString()) {
headers.add("<aws/core/utils/memory/stl/AWSStringStream.h>");
}
}
return headers;
}
public static String computeOperationNameFromInputOutputShape(String shapeName) {
String requestString = "Request";
String resultString = "Result";
int length = shapeName.length();
int suffixIndex = length;
if(shapeName.endsWith(requestString)) {
suffixIndex = length - requestString.length();
} else if (shapeName.endsWith(resultString)) {
suffixIndex = length - resultString.length();
}
return shapeName.substring(0, suffixIndex);
}
public static String computeCoreErrorConstName(String errorName) {
return CoreErrors.VARIANTS.get(errorName);
}
public static String capitalizeFirstChar(final String str) {
if (str.length() > 1) {
return str.substring(0,1).toUpperCase() + str.substring(1);
}
else {
return str.toUpperCase();
}
}
}

View File

@@ -0,0 +1,20 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class EnumMemberModel {
private String memberName;
private String memberStringValue;
}

View File

@@ -0,0 +1,26 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
import lombok.Data;
import java.util.*;
@Data
public class EnumModel {
private String name;
private List<EnumMemberModel> members;
public EnumModel(String enumName, Collection<String> enumMembers) {
name = enumName;
members = new ArrayList<>(enumMembers.size());
for (String enumMember : enumMembers) {
members.add(new EnumMemberModel(PlatformAndKeywordSanitizer.fixEnumValue(enumMember), enumMember));
}
}
}

View File

@@ -0,0 +1,173 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class PlatformAndKeywordSanitizer {
private static final Set<String> FORBIDDEN_WORDS;
private static final Map<Character,Character> ENUM_CHARS_MAPPING;
static {
Set<String> words = new HashSet<>();
words.add("alignas");
words.add("alignof");
words.add("and");
words.add("and_eq");
words.add("asm");
words.add("atomic_cancel");
words.add("atomic_commit");
words.add("atomic_noexcept");
words.add("auto");
words.add("bitand");
words.add("bitor");
words.add("bool");
words.add("break");
words.add("case");
words.add("catch");
words.add("char");
words.add("char16_t");
words.add("char32_t");
words.add("class");
words.add("compl");
words.add("concept");
words.add("const");
words.add("constexpr");
words.add("const_cast");
words.add("continue");
words.add("co_await");
words.add("co_return");
words.add("co_yeild");
words.add("decltype");
words.add("default");
words.add("delete");
words.add("do");
words.add("double");
words.add("dynamic_cast");
words.add("else");
words.add("enum");
words.add("explicit");
words.add("export");
words.add("extern");
words.add("false");
words.add("float");
words.add("for");
words.add("friend");
words.add("goto");
words.add("if");
words.add("import");
words.add("inline");
words.add("int");
words.add("long");
words.add("moduel");
words.add("mutable");
words.add("namespace");
words.add("new");
words.add("noexcept");
words.add("not");
words.add("not_eq");
words.add("nullptr");
words.add("operator");
words.add("or");
words.add("or_eq");
words.add("private");
words.add("protected");
words.add("public");
words.add("reflexpr");
words.add("register");
words.add("reinterpret_cast");
words.add("requires");
words.add("return");
words.add("short");
words.add("signed");
words.add("sizeof");
words.add("static");
words.add("static_assert");
words.add("static_cast");
words.add("struct");
words.add("switch");
words.add("synchronized");
words.add("template");
words.add("this");
words.add("thread_local");
words.add("throw");
words.add("true");
words.add("try");
words.add("typeof");
words.add("typeid");
words.add("typename");
words.add("union");
words.add("unsigned");
words.add("using");
words.add("virtual");
words.add("void");
words.add("volatile");
words.add("wchar_t");
words.add("while");
words.add("xor");
words.add("xor_eq");
words.add("ANDROID");
words.add("BOOL");
words.add("CHAR");
words.add("DEBUG");
words.add("DELETE");
words.add("Double");
words.add("ERROR");
words.add("GET");
words.add("NEW");
words.add("NULL");
words.add("PRIVATE");
words.add("PUBLIC");
words.add("STATIC");
words.add("T_CHAR");
words.add("DOMAIN");
words.add("*");
//ok you get the idea... add them as you encounter them.
FORBIDDEN_WORDS = Collections.unmodifiableSet(words);
}
static {
Map<Character,Character> mapping = new HashMap<>();
mapping.put('-', '_');
mapping.put(':', '_');
mapping.put('.', '_');
mapping.put('*', '_');
mapping.put('/', '_');
mapping.put('(', '_');
mapping.put(')', '_');
mapping.put(' ', '_');
ENUM_CHARS_MAPPING = Collections.unmodifiableMap(mapping);
}
// Converts C2J enum strings to a valid character set for c++.
public static String fixEnumValue (String enumValue) {
String enumMemberName = enumValue;
for (Character invalid : ENUM_CHARS_MAPPING.keySet()) {
enumMemberName = enumMemberName.replace(invalid, ENUM_CHARS_MAPPING.get(invalid));
}
enumMemberName = enumMemberName.replaceAll("_{2,}", "_").replaceAll("_$", "");
if (FORBIDDEN_WORDS.contains(enumMemberName)) {
enumMemberName += "_";
}
//replace starting number with underscore.
char firstChar = enumMemberName.charAt(0);
if(firstChar >= '0' && firstChar <= '9') {
enumMemberName = "_" + enumMemberName;
}
return enumMemberName;
}
}

View File

@@ -0,0 +1,24 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
/**
* Abstract class for generating AWS Client Code. All generators should implement this interface
*/
public interface ClientGenerator {
/**
* Generates all source files for a service based on a filled in service model
*
* @param serviceModel Service Model to use in generation.
* @return
*/
SdkFileEntry[] generateSourceFiles(final ServiceModel serviceModel) throws Exception;
}

View File

@@ -0,0 +1,31 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators;
import com.amazonaws.util.awsclientgenerator.domainmodels.c2j.C2jServiceModel;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.File;
import java.nio.charset.StandardCharsets;
public class DirectFromC2jGenerator {
private final MainClientGenerator mainClientGenerator;
public DirectFromC2jGenerator(final MainClientGenerator mainClientGenerator) {
this.mainClientGenerator = mainClientGenerator;
}
public File generateSourceFromJson(String rawJson, String languageBinding, String serviceName, String namespace, String licenseText, boolean generateStandalonePackage, boolean enableVirtualOperations) throws Exception {
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
C2jServiceModel c2jServiceModel = gson.fromJson(rawJson, C2jServiceModel.class);
c2jServiceModel.setServiceName(serviceName);
return mainClientGenerator.generateSourceFromC2jModel(c2jServiceModel, serviceName, languageBinding, namespace, licenseText, generateStandalonePackage, enableVirtualOperations);
}
}

View File

@@ -0,0 +1,94 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators;
import com.amazonaws.util.awsclientgenerator.SdkSpec;
import com.amazonaws.util.awsclientgenerator.config.ServiceGeneratorConfig;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.c2j.C2jServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.transform.C2jModelToGeneratorModelTransformer;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class MainClientGenerator {
public File generateSourceFromC2jModel(C2jServiceModel c2jModel, String serviceName, String languageBinding, String namespace, String licenseText, boolean generateStandalonePackage, boolean enableVirtualOperations) throws Exception {
SdkSpec spec = new SdkSpec(languageBinding, serviceName, null);
// Transform to ServiceModel
ServiceModel serviceModel = new C2jModelToGeneratorModelTransformer(c2jModel, generateStandalonePackage).convert();
serviceModel.setRuntimeMajorVersion("@RUNTIME_MAJOR_VERSION@");
serviceModel.setRuntimeMajorVersionUpperBound("@RUNTIME_MAJOR_VERSION_UPPER_BOUND@");
serviceModel.setRuntimeMinorVersion("@RUNTIME_MINOR_VERSION@");
serviceModel.setNamespace(namespace);
serviceModel.setLicenseText(licenseText);
serviceModel.setEnableVirtualOperations(enableVirtualOperations);
spec.setVersion(serviceModel.getMetadata().getApiVersion());
String protocol = serviceModel.getMetadata().getProtocol();
ClientGenerator clientGenerator = ServiceGeneratorConfig.findGenerator(spec, protocol);
//use serviceName and version to convert the json over.
SdkFileEntry[] apiFiles = clientGenerator.generateSourceFiles(serviceModel);
String sdkOutputName = String.format("aws-%s-sdk-%s", spec.getLanguageBinding(), serviceModel.getMetadata().getProjectName());
File finalOutputFile = File.createTempFile(sdkOutputName, ".zip");
//we need to add a BOM to accommodate MSFT compilers.
//as specified here https://blogs.msdn.microsoft.com/vcblog/2016/02/22/new-options-for-managing-character-sets-in-the-microsoft-cc-compiler/
byte[] bom = {(byte)0xEF,(byte)0xBB,(byte)0xBF};
FileOutputStream fileOutputStream = new FileOutputStream(finalOutputFile);
try (ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream, StandardCharsets.UTF_8)) {
for (SdkFileEntry apiFile : apiFiles) {
if (apiFile != null && apiFile.getPathRelativeToRoot() != null) {
ZipEntry zipEntry = new ZipEntry(String.format("%s/%s", sdkOutputName, apiFile.getPathRelativeToRoot()));
zipOutputStream.putNextEntry(zipEntry);
if(apiFile.isNeedsByteOrderMark()) {
zipOutputStream.write(bom);
}
zipOutputStream.write(apiFile.getSdkFile().toString().getBytes(StandardCharsets.UTF_8));
zipOutputStream.closeEntry();
}
}
}
return finalOutputFile;
}
/**
* Loads a json file into a service model object.
*
* @param path path to the json file.
* @return Service Model (model of the json object in the specified file)
* @throws IOException
*/
private C2jServiceModel loadServiceModelFromFile(final String path) throws IOException {
StringBuilder inputJson = new StringBuilder();
try (Reader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream(path), StandardCharsets.UTF_8.name())) {
char[] inputBuffer = new char[1024];
while (reader.read(inputBuffer) >= 0) {
inputJson.append(new String(inputBuffer));
}
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
return gson.fromJson(inputJson.toString(), C2jServiceModel.class);
}
}
}

View File

@@ -0,0 +1,458 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Error;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Operation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.EnumModel;
import com.amazonaws.util.awsclientgenerator.generators.ClientGenerator;
import com.amazonaws.util.awsclientgenerator.generators.exceptions.SourceGenerationFailedException;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.*;
public abstract class CppClientGenerator implements ClientGenerator {
protected final VelocityEngine velocityEngine;
public CppClientGenerator() throws Exception {
velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogChute");
velocityEngine.setProperty("template.provide.scope.control", true);
velocityEngine.init();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
//for c++, the way serialization works, we want to remove all required fields so we can do a value has been set
//check on all fields.
serviceModel.getShapes().values().stream().filter(hasMembers -> hasMembers.getMembers() != null).forEach(shape ->
shape.getMembers().values().stream().filter(shapeMember ->
shapeMember.isRequired()).forEach( member -> member.setRequired(false)));
getOperationsToRemove().stream().forEach(operation ->
{
serviceModel.getOperations().remove(operation);
});
List<SdkFileEntry> fileList = new ArrayList<>();
fileList.addAll(generateModelHeaderFiles(serviceModel));
fileList.addAll(generateModelSourceFiles(serviceModel));
fileList.add(generateClientHeaderFile(serviceModel));
fileList.add(generateClientSourceFile(serviceModel));
fileList.add(generateARNHeaderFile(serviceModel));
fileList.add(generateARNSourceFile(serviceModel));
fileList.add(generateRegionHeaderFile(serviceModel));
fileList.add(generateRegionSourceFile(serviceModel));
fileList.add(generateErrorsHeaderFile(serviceModel));
fileList.add(generateErrorMarshallerHeaderFile(serviceModel));
fileList.add(generateErrorSourceFile(serviceModel));
fileList.add(generateErrorMarshallingSourceFile(serviceModel));
fileList.add(generateServiceRequestHeader(serviceModel));
fileList.add(generateExportHeader(serviceModel));
fileList.add(generateCmakeFile(serviceModel));
SdkFileEntry[] retArray = new SdkFileEntry[fileList.size()];
return fileList.toArray(retArray);
}
protected final VelocityContext createContext(final ServiceModel serviceModel) {
VelocityContext context = new VelocityContext();
context.put("nl", System.lineSeparator());
context.put("serviceModel", serviceModel);
context.put("input.encoding", StandardCharsets.UTF_8.name());
context.put("output.encoding", StandardCharsets.UTF_8.name());
return context;
}
protected List<SdkFileEntry> generateModelHeaderFiles(final ServiceModel serviceModel) throws Exception {
List<SdkFileEntry> sdkFileEntries = new ArrayList<>();
for (Map.Entry<String, Shape> shapeEntry : serviceModel.getShapes().entrySet()) {
SdkFileEntry sdkFileEntry = generateModelHeaderFile(serviceModel, shapeEntry);
if (sdkFileEntry != null) {
sdkFileEntries.add(sdkFileEntry);
}
sdkFileEntry = generateEventStreamHandlerHeaderFile(serviceModel, shapeEntry);
if (sdkFileEntry != null) {
sdkFileEntries.add(sdkFileEntry);
}
}
return sdkFileEntries;
}
protected SdkFileEntry generateModelHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (!(shape.isRequest() || shape.isEnum() || shape.hasEventPayloadMembers() && shape.hasBlobMembers())) {
return null;
}
Template template = null;
VelocityContext context = createContext(serviceModel);
if (shape.isRequest()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/RequestHeader.vm", StandardCharsets.UTF_8.name());
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
String key = opEntry.getKey();
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName()) {
context.put("operation", op);
context.put("operationName", key);
break;
}
}
}
else if (shape.isEnum()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelEnumHeader.vm", StandardCharsets.UTF_8.name());
EnumModel enumModel = new EnumModel(shapeEntry.getKey(), shape.getEnumValues());
context.put("enumModel", enumModel);
}
else if (shape.hasEventPayloadMembers() && shape.hasBlobMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/EventHeader.vm", StandardCharsets.UTF_8.name());
if (shape.getMembers().size() != 1) {
throw new RuntimeException("Blob event shape used in Event Stream should only has one member.");
}
shape.getMembers().entrySet().stream().filter(memberEntry -> memberEntry.getValue().getShape().isBlob()).forEach(blobMemberEntry -> context.put("blobMember", blobMemberEntry));
}
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/model/%s.h", serviceModel.getMetadata().getProjectName(),
shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
protected SdkFileEntry generateEventStreamHandlerHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isRequest()) {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/RequestEventStreamHandlerHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
String key = opEntry.getKey();
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName() && op.getResult() != null) {
if (op.getResult().getShape().hasEventStreamMembers()) {
for (Map.Entry<String, ShapeMember> shapeMemberEntry : op.getResult().getShape().getMembers().entrySet()) {
if (shapeMemberEntry.getValue().getShape().isEventStream()) {
context.put("eventStreamShape", shapeMemberEntry.getValue().getShape());
context.put("operation", op);
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/model/%sHandler.h", serviceModel.getMetadata().getProjectName(), key);
return makeFile(template, context, fileName, true);
}
}
}
}
}
}
return null;
}
protected List<SdkFileEntry> generateModelSourceFiles(final ServiceModel serviceModel) throws Exception {
List<SdkFileEntry> sdkFileEntries = new ArrayList<>();
for (Map.Entry<String, Shape> shapeEntry : serviceModel.getShapes().entrySet()) {
SdkFileEntry sdkFileEntry = generateModelSourceFile(serviceModel, shapeEntry);
if (sdkFileEntry != null)
{
sdkFileEntries.add(sdkFileEntry);
}
sdkFileEntry = generateEventStreamHandlerSourceFile(serviceModel, shapeEntry);
if (sdkFileEntry != null)
{
sdkFileEntries.add(sdkFileEntry);
}
}
return sdkFileEntries;
}
protected abstract SdkFileEntry generateErrorMarshallerHeaderFile(ServiceModel serviceModel) throws Exception;
//these probably don't need to be abstract, since xml and json implementations are not considered here.
protected abstract SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception;
protected abstract SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception;
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
Template template;
VelocityContext context = createContext(serviceModel);
if (shape.isEnum()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/EnumSource.vm", StandardCharsets.UTF_8.name());
EnumModel enumModel = new EnumModel(shapeEntry.getKey(), shape.getEnumValues());
context.put("enumModel", enumModel);
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%s.cpp", shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
protected SdkFileEntry generateEventStreamHandlerSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isRequest()) {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlRequestEventStreamHandlerSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
String key = opEntry.getKey();
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName() && op.getResult() != null) {
if (op.getResult().getShape().hasEventStreamMembers()) {
for (Map.Entry<String, ShapeMember> shapeMemberEntry : op.getResult().getShape().getMembers().entrySet()) {
if (shapeMemberEntry.getValue().getShape().isEventStream()) {
context.put("eventStreamShape", shapeMemberEntry.getValue().getShape());
context.put("operation", op);
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%sHandler.cpp", key);
return makeFile(template, context, fileName, true);
}
}
}
}
}
}
return null;
}
protected SdkFileEntry generateErrorSourceFile(final ServiceModel serviceModel) throws Exception {
Set<String> retryableErrors = getRetryableErrors();
for(Error error : serviceModel.getServiceErrors()) {
if(retryableErrors.contains(error.getName())) {
error.setRetryable(true);
}
}
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceErrorsSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("ErrorFormatter", ErrorFormatter.class);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sErrors.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected Set<String> getRetryableErrors() {
HashSet<String> exceptions = new HashSet<>();
exceptions.add("Throttling");
exceptions.add("ThrottlingException");
exceptions.add("ThrottledException");
exceptions.add("RequestThrottledException");
exceptions.add("TooManyRequestsException");
exceptions.add("ProvisionedThroughputExceededException");
exceptions.add("TransactionInProgressException");
exceptions.add("RequestLimitExceeded");
exceptions.add("BandwidthLimitExceeded");
exceptions.add("LimitExceededException");
exceptions.add("RequestThrottled");
exceptions.add("SlowDown");
exceptions.add("PriorRequestNotComplete");
exceptions.add("EC2ThrottledException");
return exceptions;
}
protected SdkFileEntry generateErrorMarshallingSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceErrorMarshallerSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
String fileName = String.format("source/%sErrorMarshaller.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected SdkFileEntry generateErrorsHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/ErrorsHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
ErrorFormatter errorFormatter = new ErrorFormatter();
context.put("errorConstNames", errorFormatter.formatErrorConstNames(serviceModel.getNonCoreServiceErrors()));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sErrors.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected SdkFileEntry generateARNHeaderFile(final ServiceModel serviceModel) throws Exception {
// no-op for services other than S3.
return null;
}
protected SdkFileEntry generateARNSourceFile(final ServiceModel serviceModel) throws Exception {
// no-op for services other than S3.
return null;
}
private SdkFileEntry generateServiceRequestHeader(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/AbstractServiceRequest.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sRequest.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected SdkFileEntry generateRegionHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/EndpointEnumHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("exportValue", String.format("AWS_%s_API", serviceModel.getMetadata().getClassNamePrefix().toUpperCase()));
String fileName = String.format("include/aws/%s/%sEndpoint.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected SdkFileEntry generateRegionSourceFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/EndpointEnumSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("endpointMapping", computeEndpointMappingForService(serviceModel));
String fileName = String.format("source/%sEndpoint.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
protected Map<String, String> computeEndpointMappingForService(ServiceModel serviceModel) {
Map<String, String> endpoints = new HashMap<>();
if (serviceModel.getServiceName().equals("budgets") ||
serviceModel.getServiceName().equals("cloudfront") ||
serviceModel.getServiceName().equals("importexport") ||
serviceModel.getServiceName().equals("savingsplans") ||
serviceModel.getServiceName().equals("waf"))
{
serviceModel.getMetadata().setGlobalEndpoint(serviceModel.getServiceName() + ".amazonaws.com");
} else if (serviceModel.getServiceName().equals("ce")) {
serviceModel.getMetadata().setGlobalEndpoint("ce.us-east-1.amazonaws.com");
} else if (serviceModel.getServiceName().equals("chime")) {
serviceModel.getMetadata().setGlobalEndpoint("service.chime.aws.amazon.com");
} else if (serviceModel.getServiceName().equals("iam")) {
endpoints.put("cn-north-1", "iam.cn-north-1.amazonaws.com.cn");
endpoints.put("cn-northwest-1", "iam.cn-north-1.amazonaws.com.cn");
endpoints.put("us-gov-east-1", "iam.us-gov.amazonaws.com");
endpoints.put("us-gov-west-1", "iam.us-gov.amazonaws.com");
endpoints.put("us-iso-east-1", "iam.us-iso-east-1.c2s.ic.gov");
endpoints.put("us-isob-east-1", "iam.us-isob-east-1.sc2s.sgov.gov");
serviceModel.getMetadata().setGlobalEndpoint("iam.amazonaws.com");
} else if (serviceModel.getServiceName().equals("kms")) {
endpoints.put("us-iso-east-1", "kms-fips.us-iso-east-1.c2s.ic.gov");
endpoints.put("us-isob-east-1", "kms-fips.us-isob-east-1.sc2s.sgov.gov");
} else if (serviceModel.getServiceName().equals("organizations")) {
endpoints.put("us-gov-west-1", "organizations.us-gov-west-1.amazonaws.com");
serviceModel.getMetadata().setGlobalEndpoint("organizations.us-east-1.amazonaws.com");
} else if (serviceModel.getServiceName().equals("route53")) {
endpoints.put("us-gov-west-1", "route53.us-gov.amazonaws.com");
endpoints.put("us-iso-east-1", "route53.c2s.ic.gov");
serviceModel.getMetadata().setGlobalEndpoint("route53.amazonaws.com");
} else if (serviceModel.getServiceName().equals("sts")) {
serviceModel.getMetadata().setGlobalEndpoint(null);
}
return endpoints;
}
private SdkFileEntry generateExportHeader(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceExportHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%s_EXPORTS.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
private SdkFileEntry generateCmakeFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/CMakeFile.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
return makeFile(template, context, "CMakeLists.txt", false);
}
protected final SdkFileEntry makeFile(Template template, VelocityContext context, String path, boolean needsBOM) throws IOException {
StringWriter sw = new StringWriter();
template.merge(context, sw);
try {
sw.close();
} catch (IOException e) {
throw new SourceGenerationFailedException(String.format("Generation of template failed for template %s", template.getName()), e);
}
sw.flush();
StringBuffer sb = new StringBuffer();
sb.append(sw.toString());
SdkFileEntry file = new SdkFileEntry();
file.setPathRelativeToRoot(path);
file.setSdkFile(sb);
file.setNeedsByteOrderMark(needsBOM);
return file;
}
protected Set<String> getOperationsToRemove(){
return new HashSet<String>();
}
}

View File

@@ -0,0 +1,37 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Error;
import com.google.common.base.CaseFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ErrorFormatter {
public List<String> formatErrorConstNames(Collection<Error> errors) {
List<String> formattedErrors = new ArrayList<>();
for (Error error : errors) {
formattedErrors.add(formatErrorConstName(error.getName()));
}
Collections.sort(formattedErrors);
return formattedErrors;
}
public static String formatErrorConstName(String errorName) {
String upper = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, errorName.replaceAll("\\.", "_"));
if (upper.endsWith("_ERROR")) {
upper = upper.substring(0, upper.length() - "_ERROR".length());
}
if (upper.endsWith("_EXCEPTION")) {
upper = upper.substring(0, upper.length() - "_EXCEPTION".length());
}
return upper;
}
}

View File

@@ -0,0 +1,207 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Operation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;;
public class JsonCppClientGenerator extends CppClientGenerator {
public JsonCppClientGenerator() throws Exception {
super();
}
@Override
protected SdkFileEntry generateErrorMarshallerHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonErrorMarshallerHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sErrorMarshaller.h",
serviceModel.getMetadata().getProjectName(), serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateModelHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isException() && !shape.isJsonModeledException())
return null;
if (shape.isResult() && shape.hasEventStreamMembers())
return null;
//we only want to override json related stuff.
if (shape.isRequest() || shape.isEnum() || shape.hasEventPayloadMembers() && shape.hasBlobMembers()) {
return super.generateModelHeaderFile(serviceModel, shapeEntry);
}
if (shape.isStructure() && shape.isReferenced()) {
Template template = null;
VelocityContext context = createContext(serviceModel);
if (shape.isResult()) {
if (shape.hasStreamMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamResultHeader.vm", StandardCharsets.UTF_8.name());
} else {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonResultHeader.vm", StandardCharsets.UTF_8.name());
}
} else if (shape.isEventStream() && shape.hasNestedEventPayloadMembers()) { // streams with event-payload members are input event-streams
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/EventStreamHeader.vm", StandardCharsets.UTF_8.name());
} else if (shape.isStructure()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonSubObjectHeader.vm", StandardCharsets.UTF_8.name());
}
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/model/%s.h", serviceModel.getMetadata().getProjectName(),
shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isResult() && shape.hasEventStreamMembers())
return null;
// if the shape is an event and has a single blob member then we don't need a source file, because the whole
// class is implemented in the header file. See EventHeader.vm
if (shape.isEvent() && shape.getMembers().size() == 1 && shape.hasBlobMembers())
return null;
if (shape.isException() && !shape.isJsonModeledException())
return null;
if (shape.isEventStream())
return null;
if (shape.isEnum()) {
// event-stream input shapes do their serialization via the encoder; So skip generating code for those.
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
if (shape.isStructure() && shape.isReferenced()) {
Template template;
VelocityContext context = createContext(serviceModel);
if (shape.isRequest() && (shape.hasStreamMembers() || shape.hasEventStreamMembers())) {
if (shape.hasEventStreamMembers()) {
HashMap<String, String> headersMap = new HashMap<>(10);
headersMap.put("Aws::Http::CONTENT_TYPE_HEADER", "Aws::AMZN_EVENTSTREAM_CONTENT_TYPE");
context.put("requestSpecificHeaders", headersMap);
}
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamRequestSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isRequest()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonRequestSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isResult() && shape.hasStreamMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamResultSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isResult()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonResultSource.vm", StandardCharsets.UTF_8.name());
} else {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonSubObjectSource.vm", StandardCharsets.UTF_8.name());
}
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName()) {
context.put("operation", op);
break;
}
}
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
context.put("presignerTemplate", "/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonDumpBodyToUrl.vm");
String fileName = String.format("source/model/%s.cpp", shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateEventStreamHandlerSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isRequest()) {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonEventStreamHandlerSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
String key = opEntry.getKey();
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName() && op.getResult() != null) {
if (op.getResult().getShape().hasEventStreamMembers()) {
for (Map.Entry<String, ShapeMember> shapeMemberEntry : op.getResult().getShape().getMembers().entrySet()) {
if (shapeMemberEntry.getValue().getShape().isEventStream()) {
context.put("eventStreamShape", shapeMemberEntry.getValue().getShape());
context.put("operation", op);
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%sHandler.cpp", key);
return makeFile(template, context, fileName, true);
}
}
}
}
}
}
return null;
}
}

View File

@@ -0,0 +1,186 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class QueryCppClientGenerator extends CppClientGenerator {
public QueryCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
Shape shape = new Shape();
shape.setName("ResponseMetadata");
shape.setReferenced(true);
shape.setType("structure");
Shape stringShape = new Shape();
stringShape.setName("RequestId");
stringShape.setType("string");
ShapeMember stringShapeMember = new ShapeMember();
stringShapeMember.setShape(stringShape);
shape.setMembers(new HashMap<>());
shape.getMembers().put("RequestId", stringShapeMember);
serviceModel.getShapes().put("ResponseMetadata", shape);
ShapeMember responseMetadataMember = new ShapeMember();
responseMetadataMember.setShape(shape);
responseMetadataMember.setRequired(true);
responseMetadataMember.setValidationNeeded(true);
for(Shape resultShape : serviceModel.getShapes().values()) {
if(resultShape.isResult()) {
resultShape.getMembers().put("ResponseMetadata", responseMetadataMember);
}
}
//query api ALWAYS needs a request shape, because it needs to send action and version as part of the payload
//we don't want to add it to the operation however, because there is no need for the user to be aware of the existence of this
//type.
serviceModel.getOperations().values().stream().filter(operation -> operation.getRequest() == null).forEach(operation -> {
Shape requestShape = new Shape();
requestShape.setName(operation.getName() + "Request");
requestShape.setReferenced(true);
requestShape.setRequest(true);
requestShape.setType("structure");
requestShape.setMembers(new HashMap<>());
requestShape.setSupportsPresigning(true);
serviceModel.getShapes().put(requestShape.getName(), requestShape);
ShapeMember shapeMemberForRequest = new ShapeMember();
shapeMemberForRequest.setDocumentation("");
shapeMemberForRequest.setShape(requestShape);
operation.setRequest(shapeMemberForRequest);
});
serviceModel.getOperations().values().stream().forEach(operation -> {
operation.getRequest().getShape().setSupportsPresigning(true);
});
return super.generateSourceFiles(serviceModel);
}
@Override
protected SdkFileEntry generateModelHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isException() && !shape.isXmlModeledException())
return null;
//we only want to handle results and internal structures. We don't want requests or enums.
if (shape.isRequest() || shape.isEnum() || shape.hasEventPayloadMembers() && shape.hasBlobMembers()) {
return super.generateModelHeaderFile(serviceModel, shapeEntry);
}
if (shape.isStructure() && shape.isReferenced()) {
Template template = null;
VelocityContext context = createContext(serviceModel);
if (shape.isResult()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlResultHeader.vm", StandardCharsets.UTF_8.name());
} else if (!shape.isRequest() && shape.isStructure()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/queryxml/QueryXmlSubObjectHeader.vm", StandardCharsets.UTF_8.name());
}
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/model/%s.h", serviceModel.getMetadata().getProjectName(),
shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isException() && !shape.isXmlModeledException())
return null;
if (shape.isEnum()) {
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
Template template = null;
VelocityContext context = createContext(serviceModel);
if (shape.isStructure() && shape.isReferenced()) {
if (shape.isRequest()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/queryxml/QueryRequestSource.vm", StandardCharsets.UTF_8.name());
} else if (shape.isResult()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/queryxml/QueryXmlResultSource.vm", StandardCharsets.UTF_8.name());
} else {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/queryxml/QueryXmlSubObjectSource.vm", StandardCharsets.UTF_8.name());
}
}
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%s.cpp", shapeEntry.getKey());
if (template == null)
return null;
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/queryxml/QueryXmlServiceClientSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateErrorMarshallerHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlErrorMarshallerHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sErrorMarshaller.h",
serviceModel.getMetadata().getProjectName(), serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,157 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Operation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class RestXmlCppClientGenerator extends CppClientGenerator {
public RestXmlCppClientGenerator() throws Exception {
super();
}
@Override
protected SdkFileEntry generateErrorMarshallerHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlErrorMarshallerHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sErrorMarshaller.h",
serviceModel.getMetadata().getProjectName(), serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateModelHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isException() && !shape.isXmlModeledException())
return null;
//we only want to override json related stuff.
if (shape.isRequest() || shape.isEnum() || shape.hasEventPayloadMembers() && shape.hasBlobMembers()) {
return super.generateModelHeaderFile(serviceModel, shapeEntry);
}
// Will not generate source code if it's a shape of event, with empty member.
if (shape.isStructure() && shape.isReferenced() &&
!(shape.isEventStream() || (shape.isEvent() && shape.getMembers().isEmpty()) || (shape.isResult() && shape.hasEventStreamMembers()))) {
Template template = null;
VelocityContext context = createContext(serviceModel);
if (shape.isResult() && shape.hasStreamMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamResultHeader.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isResult()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlResultHeader.vm", StandardCharsets.UTF_8.name());
}else if (!shape.isRequest() && shape.isStructure()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlSubObjectHeader.vm", StandardCharsets.UTF_8.name());
}
if(template == null) return null; //temporary
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/model/%s.h", serviceModel.getMetadata().getProjectName(),
shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isException() && !shape.isXmlModeledException())
return null;
if (shape.isEnum()) {
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
if (shape.isStructure() && shape.isReferenced() &&
!(shape.isEventStream() ||
shape.hasBlobMembers() && shape.hasEventPayloadMembers() ||
shape.isEvent() && shape.getMembers().isEmpty() ||
shape.isResult() && shape.hasEventStreamMembers())) {
Template template = null;
VelocityContext context = createContext(serviceModel);
for (Map.Entry<String, Operation> opEntry : serviceModel.getOperations().entrySet()) {
Operation op = opEntry.getValue();
if (op.getRequest() != null && op.getRequest().getShape().getName() == shape.getName()) {
context.put("operation", op);
break;
}
}
if (shape.isRequest() && shape.hasStreamMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamRequestSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isRequest()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlRequestSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isResult() && shape.hasStreamMembers()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamResultSource.vm", StandardCharsets.UTF_8.name());
}
else if (shape.isResult()) {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlResultSource.vm", StandardCharsets.UTF_8.name());
} else {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlSubObjectSource.vm", StandardCharsets.UTF_8.name());
}
if(template == null) return null; //temporary;
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%s.cpp", shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return null;
}
}

View File

@@ -0,0 +1,56 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.apigateway;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import com.google.common.collect.Sets;
import java.util.Map;
import java.util.Set;
public class APIGatewayRestJsonCppClientGenerator extends JsonCppClientGenerator {
public APIGatewayRestJsonCppClientGenerator() throws Exception {
super();
}
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
serviceModel.getMetadata().setAcceptHeader("application/json");
Shape invokeMethodRequest = serviceModel.getShapes().get("TestInvokeMethodRequest");
Map<String, ShapeMember> members = invokeMethodRequest.getMembers();
//rename body
ShapeMember bodyMember = members.get("body");
members.put("requestBody", bodyMember);
members.remove("body");
//rename headers
ShapeMember headersMember = members.get("headers");
members.put("requestHeaders", headersMember);
members.remove("headers");
Shape authorizerRequest = serviceModel.getShapes().get("TestInvokeAuthorizerRequest");
members = authorizerRequest.getMembers();
//rename body
bodyMember = members.get("body");
members.put("requestBody", bodyMember);
members.remove("body");
//rename headers
headersMember = members.get("headers");
members.put("requestHeaders", headersMember);
members.remove("headers");
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,42 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.apigatewayv2;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import java.util.Map;
public class APIGatewayV2RestJsonCppClientGenerator extends JsonCppClientGenerator {
public APIGatewayV2RestJsonCppClientGenerator() throws Exception {
super();
}
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
Shape importApiRequest = serviceModel.getShapes().get("ImportApiRequest");
Map<String, ShapeMember> members = importApiRequest.getMembers();
//rename body
ShapeMember bodyMember = members.get("Body");
members.put("requestBody", bodyMember);
members.remove("Body");
Shape reimportApiRequest = serviceModel.getShapes().get("ReimportApiRequest");
members = reimportApiRequest.getMembers();
//rename body
bodyMember = members.get("Body");
members.put("requestBody", bodyMember);
members.remove("Body");
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,45 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.cloudfront;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.RestXmlCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class CloudfrontCppClientGenerator extends RestXmlCppClientGenerator {
public CloudfrontCppClientGenerator() throws Exception {
super();
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Shape shape = shapeEntry.getValue();
if (shape.isResult()) {
VelocityContext context = createContext(serviceModel);
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/CloudfrontXmlResultSource.vm", StandardCharsets.UTF_8.name());
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/model/%s.cpp", shapeEntry.getKey());
return makeFile(template, context, fileName, true);
}
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
}

View File

@@ -0,0 +1,76 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.dynamodb;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import org.apache.velocity.Template;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class DynamoDBJsonCppClientGenerator extends JsonCppClientGenerator {
public DynamoDBJsonCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
// add a helper class that is used for AttributeValue values.
Shape attributeValueShape = new Shape();
attributeValueShape.setName("AttributeValueValue");
attributeValueShape.setType("structure");
serviceModel.getShapes().put(attributeValueShape.getName(), attributeValueShape);
return super.generateSourceFiles(serviceModel);
}
@Override
protected SdkFileEntry generateModelHeaderFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
switch(shapeEntry.getKey()) {
case "AttributeValue": {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/dynamodb/AttributeValueHeader.vm", StandardCharsets.UTF_8.name());
return makeFile(template, createContext(serviceModel), "include/aws/dynamodb/model/AttributeValue.h", true);
}
case "AttributeValueValue": {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/dynamodb/AttributeValueValueHeader.vm", StandardCharsets.UTF_8.name());
return makeFile(template, createContext(serviceModel), "include/aws/dynamodb/model/AttributeValueValue.h", true);
}
default:
return super.generateModelHeaderFile(serviceModel, shapeEntry);
}
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
switch(shapeEntry.getKey()) {
case "AttributeValue": {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/dynamodb/AttributeValueSource.vm");
return makeFile(template, createContext(serviceModel), "source/model/AttributeValue.cpp", true);
}
case "AttributeValueValue": {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/dynamodb/AttributeValueValueSource.vm");
return makeFile(template, createContext(serviceModel), "source/model/AttributeValueValue.cpp", true);
}
default:
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
}
@Override
protected Set<String> getRetryableErrors() {
Set<String> exceptions = super.getRetryableErrors();
exceptions.add("ResourceInUseException");
return exceptions;
}
}

View File

@@ -0,0 +1,745 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.ec2;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.*;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Error;
import com.amazonaws.util.awsclientgenerator.generators.cpp.QueryCppClientGenerator;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Ec2CppClientGenerator extends QueryCppClientGenerator{
public Ec2CppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
List<String> keysToRename = new LinkedList<>();
Map<String, Shape> shapes = serviceModel.getShapes();
for (final String key : shapes.keySet()) {
final Shape shape = shapes.get(key);
shape.setName(shape.getName().replaceAll("Result$", "Response"));
shape.setType(shape.getType().replaceAll("Result$", "Response"));
keysToRename.add(key);
}
for (final String key : keysToRename) {
final Shape shape = shapes.get(key);
shapes.remove(key);
shapes.put(key.replaceAll("Result$", "Response"), shape);
}
//add "disabled" state to SpotInstanceState
List<String> spotInstanceStateEnumValues = shapes.get("SpotInstanceState").getEnumValues();
if(!spotInstanceStateEnumValues.contains("disabled")) {
spotInstanceStateEnumValues.add("disabled");
}
final Collection<Error> serviceErrors = serviceModel.getServiceErrors();
final Error activeVpcPeeringConnectionPerVpcLimitExceeded = new Error();
activeVpcPeeringConnectionPerVpcLimitExceeded.setName("ActiveVpcPeeringConnectionPerVpcLimitExceeded");
activeVpcPeeringConnectionPerVpcLimitExceeded.setText("ActiveVpcPeeringConnectionPerVpcLimitExceeded");
serviceErrors.add(activeVpcPeeringConnectionPerVpcLimitExceeded);
final Error addressLimitExceeded = new Error();
addressLimitExceeded.setName("AddressLimitExceeded");
addressLimitExceeded.setText("AddressLimitExceeded");
serviceErrors.add(addressLimitExceeded);
final Error attachmentLimitExceeded = new Error();
attachmentLimitExceeded.setName("AttachmentLimitExceeded");
attachmentLimitExceeded.setText("AttachmentLimitExceeded");
serviceErrors.add(attachmentLimitExceeded);
final Error bundlingInProgress = new Error();
bundlingInProgress.setName("BundlingInProgress");
bundlingInProgress.setText("BundlingInProgress");
serviceErrors.add(bundlingInProgress);
final Error cannotDelete = new Error();
cannotDelete.setName("CannotDelete");
cannotDelete.setText("CannotDelete");
serviceErrors.add(cannotDelete);
final Error concurrentSnapshotLimitExceeded = new Error();
concurrentSnapshotLimitExceeded.setName("ConcurrentSnapshotLimitExceeded");
concurrentSnapshotLimitExceeded.setText("ConcurrentSnapshotLimitExceeded");
serviceErrors.add(concurrentSnapshotLimitExceeded);
final Error concurrentTagAccess = new Error();
concurrentTagAccess.setName("ConcurrentTagAccess");
concurrentTagAccess.setText("ConcurrentTagAccess");
serviceErrors.add(concurrentTagAccess);
final Error customerGatewayLimitExceeded = new Error();
customerGatewayLimitExceeded.setName("CustomerGatewayLimitExceeded");
customerGatewayLimitExceeded.setText("CustomerGatewayLimitExceeded");
serviceErrors.add(customerGatewayLimitExceeded);
final Error dependencyViolation = new Error();
dependencyViolation.setName("DependencyViolation");
dependencyViolation.setText("DependencyViolation");
serviceErrors.add(dependencyViolation);
final Error diskImageSizeTooLarge = new Error();
diskImageSizeTooLarge.setName("DiskImageSizeTooLarge");
diskImageSizeTooLarge.setText("DiskImageSizeTooLarge");
serviceErrors.add(diskImageSizeTooLarge);
final Error dryRunOperation = new Error();
dryRunOperation.setName("DryRunOperation");
dryRunOperation.setText("DryRunOperation");
serviceErrors.add(dryRunOperation);
final Error encryptedVolumesNotSupported = new Error();
encryptedVolumesNotSupported.setName("EncryptedVolumesNotSupported");
encryptedVolumesNotSupported.setText("EncryptedVolumesNotSupported");
serviceErrors.add(encryptedVolumesNotSupported);
final Error flowLogAlreadyExists = new Error();
flowLogAlreadyExists.setName("FlowLogAlreadyExists");
flowLogAlreadyExists.setText("FlowLogAlreadyExists");
serviceErrors.add(flowLogAlreadyExists);
final Error flowLogsLimitExceeded = new Error();
flowLogsLimitExceeded.setName("FlowLogsLimitExceeded");
flowLogsLimitExceeded.setText("FlowLogsLimitExceeded");
serviceErrors.add(flowLogsLimitExceeded);
final Error filterLimitExceeded = new Error();
filterLimitExceeded.setName("FilterLimitExceeded");
filterLimitExceeded.setText("FilterLimitExceeded");
serviceErrors.add(filterLimitExceeded);
final Error gatewayNotAttached = new Error();
gatewayNotAttached.setName("Gateway.NotAttached");
gatewayNotAttached.setText("Gateway.NotAttached");
serviceErrors.add(gatewayNotAttached);
final Error incorrectInstanceState = new Error();
incorrectInstanceState.setName("IncorrectInstanceState");
incorrectInstanceState.setText("IncorrectInstanceState");
serviceErrors.add(incorrectInstanceState);
final Error incorrectState = new Error();
incorrectState.setName("IncorrectState");
incorrectState.setText("IncorrectState");
serviceErrors.add(incorrectState);
final Error instanceAlreadyLinked = new Error();
instanceAlreadyLinked.setName("InstanceAlreadyLinked");
instanceAlreadyLinked.setText("InstanceAlreadyLinked");
serviceErrors.add(instanceAlreadyLinked);
final Error instanceLimitExceeded = new Error();
instanceLimitExceeded.setName("InstanceLimitExceeded");
instanceLimitExceeded.setText("InstanceLimitExceeded");
serviceErrors.add(instanceLimitExceeded);
final Error insufficientFreeAddressesInSubnet = new Error();
insufficientFreeAddressesInSubnet.setName("InsufficientFreeAddressesInSubnet");
insufficientFreeAddressesInSubnet.setText("InsufficientFreeAddressesInSubnet");
serviceErrors.add(insufficientFreeAddressesInSubnet);
final Error insufficientReservedInstancesCapacity = new Error();
insufficientReservedInstancesCapacity.setName("InsufficientReservedInstancesCapacity");
insufficientReservedInstancesCapacity.setText("InsufficientReservedInstancesCapacity");
serviceErrors.add(insufficientReservedInstancesCapacity);
final Error internetGatewayLimitExceeded = new Error();
internetGatewayLimitExceeded.setName("InternetGatewayLimitExceeded");
internetGatewayLimitExceeded.setText("InternetGatewayLimitExceeded");
serviceErrors.add(internetGatewayLimitExceeded);
final Error invalidAddressMalformed = new Error();
invalidAddressMalformed.setName("InvalidAddress.Malformed");
invalidAddressMalformed.setText("InvalidAddress.Malformed");
serviceErrors.add(invalidAddressMalformed);
final Error invalidAddressNotFound = new Error();
invalidAddressNotFound.setName("InvalidAddress.NotFound");
invalidAddressNotFound.setText("InvalidAddress.NotFound");
serviceErrors.add(invalidAddressNotFound);
final Error invalidAddressIDNotFound = new Error();
invalidAddressIDNotFound.setName("InvalidAddressID.NotFound");
invalidAddressIDNotFound.setText("InvalidAddressID.NotFound");
serviceErrors.add(invalidAddressIDNotFound);
final Error invalidAllocationIDNotFound = new Error();
invalidAllocationIDNotFound.setName("InvalidAllocationID.NotFound");
invalidAllocationIDNotFound.setText("InvalidAllocationID.NotFound");
serviceErrors.add(invalidAllocationIDNotFound);
final Error invalidAMIAttributeItemValue = new Error();
invalidAMIAttributeItemValue.setName("InvalidAMIAttributeItemValue");
invalidAMIAttributeItemValue.setText("InvalidAMIAttributeItemValue");
serviceErrors.add(invalidAMIAttributeItemValue);
final Error invalidAMIIDMalformed = new Error();
invalidAMIIDMalformed.setName("InvalidAMIID.Malformed");
invalidAMIIDMalformed.setText("InvalidAMIID.Malformed");
serviceErrors.add(invalidAMIIDMalformed);
final Error invalidAMIIDNotFound = new Error();
invalidAMIIDNotFound.setName("InvalidAMIID.NotFound");
invalidAMIIDNotFound.setText("InvalidAMIID.NotFound");
serviceErrors.add(invalidAMIIDNotFound);
final Error invalidAMIIDUnavailable = new Error();
invalidAMIIDUnavailable.setName("InvalidAMIID.Unavailable");
invalidAMIIDUnavailable.setText("InvalidAMIID.Unavailable");
serviceErrors.add(invalidAMIIDUnavailable);
final Error invalidAMINameDuplicate = new Error();
invalidAMINameDuplicate.setName("InvalidAMIName.Duplicate");
invalidAMINameDuplicate.setText("InvalidAMIName.Duplicate");
serviceErrors.add(invalidAMINameDuplicate);
final Error invalidAMINameMalformed = new Error();
invalidAMINameMalformed.setName("InvalidAMIName.Malformed");
invalidAMINameMalformed.setText("InvalidAMIName.Malformed");
serviceErrors.add(invalidAMINameMalformed);
final Error invalidAssociationIDNotFound = new Error();
invalidAssociationIDNotFound.setName("InvalidAssociationID.NotFound");
invalidAssociationIDNotFound.setText("InvalidAssociationID.NotFound");
serviceErrors.add(invalidAssociationIDNotFound);
final Error invalidAttachmentNotFound = new Error();
invalidAttachmentNotFound.setName("InvalidAttachment.NotFound");
invalidAttachmentNotFound.setText("InvalidAttachment.NotFound");
serviceErrors.add(invalidAttachmentNotFound);
final Error invalidAttachmentIDNotFound = new Error();
invalidAttachmentIDNotFound.setName("InvalidAttachmentID.NotFound");
invalidAttachmentIDNotFound.setText("InvalidAttachmentID.NotFound");
serviceErrors.add(invalidAttachmentIDNotFound);
final Error invalidBlockDeviceMapping = new Error();
invalidBlockDeviceMapping.setName("InvalidBlockDeviceMapping");
invalidBlockDeviceMapping.setText("InvalidBlockDeviceMapping");
serviceErrors.add(invalidBlockDeviceMapping);
final Error invalidBundleIDNotFound = new Error();
invalidBundleIDNotFound.setName("InvalidBundleID.NotFound");
invalidBundleIDNotFound.setText("InvalidBundleID.NotFound");
serviceErrors.add(invalidBundleIDNotFound);
final Error invalidConversionTaskId = new Error();
invalidConversionTaskId.setName("InvalidConversionTaskId");
invalidConversionTaskId.setText("InvalidConversionTaskId");
serviceErrors.add(invalidConversionTaskId);
final Error invalidCustomerGatewayDuplicateIpAddress = new Error();
invalidCustomerGatewayDuplicateIpAddress.setName("InvalidCustomerGateway.DuplicateIpAddress");
invalidCustomerGatewayDuplicateIpAddress.setText("InvalidCustomerGateway.DuplicateIpAddress");
serviceErrors.add(invalidCustomerGatewayDuplicateIpAddress);
final Error invalidCustomerGatewayIdMalformed = new Error();
invalidCustomerGatewayIdMalformed.setName("InvalidCustomerGatewayId.Malformed");
invalidCustomerGatewayIdMalformed.setText("InvalidCustomerGatewayId.Malformed");
serviceErrors.add(invalidCustomerGatewayIdMalformed);
final Error invalidCustomerGatewayIDNotFound = new Error();
invalidCustomerGatewayIDNotFound.setName("InvalidCustomerGatewayID.NotFound");
invalidCustomerGatewayIDNotFound.setText("InvalidCustomerGatewayID.NotFound");
serviceErrors.add(invalidCustomerGatewayIDNotFound);
final Error invalidDeviceInUse = new Error();
invalidDeviceInUse.setName("InvalidDevice.InUse");
invalidDeviceInUse.setText("InvalidDevice.InUse");
serviceErrors.add(invalidDeviceInUse);
final Error invalidDhcpOptionIDNotFound = new Error();
invalidDhcpOptionIDNotFound.setName("InvalidDhcpOptionID.NotFound");
invalidDhcpOptionIDNotFound.setText("InvalidDhcpOptionID.NotFound");
serviceErrors.add(invalidDhcpOptionIDNotFound);
final Error invalidDhcpOptionsIDNotFound = new Error();
invalidDhcpOptionsIDNotFound.setName("InvalidDhcpOptionsID.NotFound");
invalidDhcpOptionsIDNotFound.setText("InvalidDhcpOptionsID.NotFound");
serviceErrors.add(invalidDhcpOptionsIDNotFound);
final Error invalidDhcpOptionsIdMalformed = new Error();
invalidDhcpOptionsIdMalformed.setName("InvalidDhcpOptionsId.Malformed");
invalidDhcpOptionsIdMalformed.setText("InvalidDhcpOptionsId.Malformed");
serviceErrors.add(invalidDhcpOptionsIdMalformed);
final Error invalidExportTaskIDNotFound = new Error();
invalidExportTaskIDNotFound.setName("InvalidExportTaskID.NotFound");
invalidExportTaskIDNotFound.setText("InvalidExportTaskID.NotFound");
serviceErrors.add(invalidExportTaskIDNotFound);
final Error invalidFilter = new Error();
invalidFilter.setName("InvalidFilter");
invalidFilter.setText("InvalidFilter");
serviceErrors.add(invalidFilter);
final Error invalidFlowLogIdNotFound = new Error();
invalidFlowLogIdNotFound.setName("InvalidFlowLogId.NotFound");
invalidFlowLogIdNotFound.setText("InvalidFlowLogId.NotFound");
serviceErrors.add(invalidFlowLogIdNotFound);
final Error invalidFormat = new Error();
invalidFormat.setName("InvalidFormat");
invalidFormat.setText("InvalidFormat");
serviceErrors.add(invalidFormat);
final Error invalidGatewayIDNotFound = new Error();
invalidGatewayIDNotFound.setName("InvalidGatewayID.NotFound");
invalidGatewayIDNotFound.setText("InvalidGatewayID.NotFound");
serviceErrors.add(invalidGatewayIDNotFound);
final Error invalidGroupDuplicate = new Error();
invalidGroupDuplicate.setName("InvalidGroup.Duplicate");
invalidGroupDuplicate.setText("InvalidGroup.Duplicate");
serviceErrors.add(invalidGroupDuplicate);
final Error invalidGroupIdMalformed = new Error();
invalidGroupIdMalformed.setName("InvalidGroupId.Malformed");
invalidGroupIdMalformed.setText("InvalidGroupId.Malformed");
serviceErrors.add(invalidGroupIdMalformed);
final Error invalidGroupInUse = new Error();
invalidGroupInUse.setName("InvalidGroup.InUse");
invalidGroupInUse.setText("InvalidGroup.InUse");
serviceErrors.add(invalidGroupInUse);
final Error invalidGroupNotFound = new Error();
invalidGroupNotFound.setName("InvalidGroup.NotFound");
invalidGroupNotFound.setText("InvalidGroup.NotFound");
serviceErrors.add(invalidGroupNotFound);
final Error invalidGroupReserved = new Error();
invalidGroupReserved.setName("InvalidGroup.Reserved");
invalidGroupReserved.setText("InvalidGroup.Reserved");
serviceErrors.add(invalidGroupReserved);
final Error invalidID = new Error();
invalidID.setName("InvalidID");
invalidID.setText("InvalidID");
serviceErrors.add(invalidID);
final Error invalidInput = new Error();
invalidInput.setName("InvalidInput");
invalidInput.setText("InvalidInput");
serviceErrors.add(invalidInput);
final Error invalidInstanceAttributeValue = new Error();
invalidInstanceAttributeValue.setName("InvalidInstanceAttributeValue");
invalidInstanceAttributeValue.setText("InvalidInstanceAttributeValue");
serviceErrors.add(invalidInstanceAttributeValue);
final Error invalidInstanceID = new Error();
invalidInstanceID.setName("InvalidInstanceID");
invalidInstanceID.setText("InvalidInstanceID");
serviceErrors.add(invalidInstanceID);
final Error invalidInstanceIDMalformed = new Error();
invalidInstanceIDMalformed.setName("InvalidInstanceID.Malformed");
invalidInstanceIDMalformed.setText("InvalidInstanceID.Malformed");
serviceErrors.add(invalidInstanceIDMalformed);
final Error invalidInstanceIDNotFound = new Error();
invalidInstanceIDNotFound.setName("InvalidInstanceID.NotFound");
invalidInstanceIDNotFound.setText("InvalidInstanceID.NotFound");
serviceErrors.add(invalidInstanceIDNotFound);
final Error invalidInstanceIDNotLinkable = new Error();
invalidInstanceIDNotLinkable.setName("InvalidInstanceID.NotLinkable");
invalidInstanceIDNotLinkable.setText("InvalidInstanceID.NotLinkable");
serviceErrors.add(invalidInstanceIDNotLinkable);
final Error invalidInstanceType = new Error();
invalidInstanceType.setName("InvalidInstanceType");
invalidInstanceType.setText("InvalidInstanceType");
serviceErrors.add(invalidInstanceType);
final Error invalidInterfaceIpAddressLimitExceeded = new Error();
invalidInterfaceIpAddressLimitExceeded.setName("InvalidInterface.IpAddressLimitExceeded");
invalidInterfaceIpAddressLimitExceeded.setText("InvalidInterface.IpAddressLimitExceeded");
serviceErrors.add(invalidInterfaceIpAddressLimitExceeded);
final Error invalidInternetGatewayIDNotFound = new Error();
invalidInternetGatewayIDNotFound.setName("InvalidInternetGatewayID.NotFound");
invalidInternetGatewayIDNotFound.setText("InvalidInternetGatewayID.NotFound");
serviceErrors.add(invalidInternetGatewayIDNotFound);
final Error invalidIPAddressInUse = new Error();
invalidIPAddressInUse.setName("InvalidIPAddress.InUse");
invalidIPAddressInUse.setText("InvalidIPAddress.InUse");
serviceErrors.add(invalidIPAddressInUse);
final Error invalidKeyFormat = new Error();
invalidKeyFormat.setName("InvalidKey.Format");
invalidKeyFormat.setText("InvalidKey.Format");
serviceErrors.add(invalidKeyFormat);
final Error invalidKeyPairDuplicate = new Error();
invalidKeyPairDuplicate.setName("InvalidKeyPair.Duplicate");
invalidKeyPairDuplicate.setText("InvalidKeyPair.Duplicate");
serviceErrors.add(invalidKeyPairDuplicate);
final Error invalidKeyPairFormat = new Error();
invalidKeyPairFormat.setName("InvalidKeyPair.Format");
invalidKeyPairFormat.setText("InvalidKeyPair.Format");
serviceErrors.add(invalidKeyPairFormat);
final Error invalidKeyPairNotFound = new Error();
invalidKeyPairNotFound.setName("InvalidKeyPair.NotFound");
invalidKeyPairNotFound.setText("InvalidKeyPair.NotFound");
serviceErrors.add(invalidKeyPairNotFound);
final Error invalidManifest = new Error();
invalidManifest.setName("InvalidManifest");
invalidManifest.setText("InvalidManifest");
serviceErrors.add(invalidManifest);
final Error invalidNetworkAclEntryNotFound = new Error();
invalidNetworkAclEntryNotFound.setName("InvalidNetworkAclEntry.NotFound");
invalidNetworkAclEntryNotFound.setText("InvalidNetworkAclEntry.NotFound");
serviceErrors.add(invalidNetworkAclEntryNotFound);
final Error invalidNetworkAclIDNotFound = new Error();
invalidNetworkAclIDNotFound.setName("InvalidNetworkAclID.NotFound");
invalidNetworkAclIDNotFound.setText("InvalidNetworkAclID.NotFound");
serviceErrors.add(invalidNetworkAclIDNotFound);
final Error invalidNetworkInterfaceAttachmentIDMalformed = new Error();
invalidNetworkInterfaceAttachmentIDMalformed.setName("InvalidNetworkInterfaceAttachmentID.Malformed");
invalidNetworkInterfaceAttachmentIDMalformed.setText("InvalidNetworkInterfaceAttachmentID.Malformed");
serviceErrors.add(invalidNetworkInterfaceAttachmentIDMalformed);
final Error invalidNetworkInterfaceIdMalformed = new Error();
invalidNetworkInterfaceIdMalformed.setName("InvalidNetworkInterfaceId.Malformed");
invalidNetworkInterfaceIdMalformed.setText("InvalidNetworkInterfaceId.Malformed");
serviceErrors.add(invalidNetworkInterfaceIdMalformed);
final Error invalidNetworkInterfaceIDNotFound = new Error();
invalidNetworkInterfaceIDNotFound.setName("InvalidNetworkInterfaceID.NotFound");
invalidNetworkInterfaceIDNotFound.setText("InvalidNetworkInterfaceID.NotFound");
serviceErrors.add(invalidNetworkInterfaceIDNotFound);
final Error invalidOptionConflict = new Error();
invalidOptionConflict.setName("InvalidOption.Conflict");
invalidOptionConflict.setText("InvalidOption.Conflict");
serviceErrors.add(invalidOptionConflict);
final Error invalidPermissionDuplicate = new Error();
invalidPermissionDuplicate.setName("InvalidPermission.Duplicate");
invalidPermissionDuplicate.setText("InvalidPermission.Duplicate");
serviceErrors.add(invalidPermissionDuplicate);
final Error invalidPermissionMalformed = new Error();
invalidPermissionMalformed.setName("InvalidPermission.Malformed");
invalidPermissionMalformed.setText("InvalidPermission.Malformed");
serviceErrors.add(invalidPermissionMalformed);
final Error invalidPermissionNotFound = new Error();
invalidPermissionNotFound.setName("InvalidPermission.NotFound");
invalidPermissionNotFound.setText("InvalidPermission.NotFound");
serviceErrors.add(invalidPermissionNotFound);
final Error invalidPlacementGroupDuplicate = new Error();
invalidPlacementGroupDuplicate.setName("InvalidPlacementGroup.Duplicate");
invalidPlacementGroupDuplicate.setText("InvalidPlacementGroup.Duplicate");
serviceErrors.add(invalidPlacementGroupDuplicate);
final Error invalidPlacementGroupInUse = new Error();
invalidPlacementGroupInUse.setName("InvalidPlacementGroup.InUse");
invalidPlacementGroupInUse.setText("InvalidPlacementGroup.InUse");
serviceErrors.add(invalidPlacementGroupInUse);
final Error invalidPlacementGroupUnknown = new Error();
invalidPlacementGroupUnknown.setName("InvalidPlacementGroup.Unknown");
invalidPlacementGroupUnknown.setText("InvalidPlacementGroup.Unknown");
serviceErrors.add(invalidPlacementGroupUnknown);
final Error invalidPolicyDocument = new Error();
invalidPolicyDocument.setName("InvalidPolicyDocument");
invalidPolicyDocument.setText("InvalidPolicyDocument");
serviceErrors.add(invalidPolicyDocument);
final Error invalidPrefixListIdMalformed = new Error();
invalidPrefixListIdMalformed.setName("InvalidPrefixListId.Malformed");
invalidPrefixListIdMalformed.setText("InvalidPrefixListId.Malformed");
serviceErrors.add(invalidPrefixListIdMalformed);
final Error invalidPrefixListIdNotFound = new Error();
invalidPrefixListIdNotFound.setName("InvalidPrefixListId.NotFound");
invalidPrefixListIdNotFound.setText("InvalidPrefixListId.NotFound");
serviceErrors.add(invalidPrefixListIdNotFound);
final Error invalidRequest = new Error();
invalidRequest.setName("InvalidRequest");
invalidRequest.setText("InvalidRequest");
serviceErrors.add(invalidRequest);
final Error invalidReservationIDMalformed = new Error();
invalidReservationIDMalformed.setName("InvalidReservationID.Malformed");
invalidReservationIDMalformed.setText("InvalidReservationID.Malformed");
serviceErrors.add(invalidReservationIDMalformed);
final Error invalidReservationIDNotFound = new Error();
invalidReservationIDNotFound.setName("InvalidReservationID.NotFound");
invalidReservationIDNotFound.setText("InvalidReservationID.NotFound");
serviceErrors.add(invalidReservationIDNotFound);
final Error invalidReservedInstancesId = new Error();
invalidReservedInstancesId.setName("InvalidReservedInstancesId");
invalidReservedInstancesId.setText("InvalidReservedInstancesId");
serviceErrors.add(invalidReservedInstancesId);
final Error invalidReservedInstancesOfferingId = new Error();
invalidReservedInstancesOfferingId.setName("InvalidReservedInstancesOfferingId");
invalidReservedInstancesOfferingId.setText("InvalidReservedInstancesOfferingId");
serviceErrors.add(invalidReservedInstancesOfferingId);
final Error invalidRouteMalformed = new Error();
invalidRouteMalformed.setName("InvalidRoute.Malformed");
invalidRouteMalformed.setText("InvalidRoute.Malformed");
serviceErrors.add(invalidRouteMalformed);
final Error invalidRouteNotFound = new Error();
invalidRouteNotFound.setName("InvalidRoute.NotFound");
invalidRouteNotFound.setText("InvalidRoute.NotFound");
serviceErrors.add(invalidRouteNotFound);
final Error invalidRouteTableIdMalformed = new Error();
invalidRouteTableIdMalformed.setName("InvalidRouteTableId.Malformed");
invalidRouteTableIdMalformed.setText("InvalidRouteTableId.Malformed");
serviceErrors.add(invalidRouteTableIdMalformed);
final Error invalidRouteTableIDNotFound = new Error();
invalidRouteTableIDNotFound.setName("InvalidRouteTableID.NotFound");
invalidRouteTableIDNotFound.setText("InvalidRouteTableID.NotFound");
serviceErrors.add(invalidRouteTableIDNotFound);
final Error invalidSecurityGroupIDNotFound = new Error();
invalidSecurityGroupIDNotFound.setName("InvalidSecurityGroupID.NotFound");
invalidSecurityGroupIDNotFound.setText("InvalidSecurityGroupID.NotFound");
serviceErrors.add(invalidSecurityGroupIDNotFound);
final Error invalidSecurityRequestHasExpired = new Error();
invalidSecurityRequestHasExpired.setName("InvalidSecurity.RequestHasExpired");
invalidSecurityRequestHasExpired.setText("InvalidSecurity.RequestHasExpired");
serviceErrors.add(invalidSecurityRequestHasExpired);
final Error invalidServiceName = new Error();
invalidServiceName.setName("InvalidServiceName");
invalidServiceName.setText("InvalidServiceName");
serviceErrors.add(invalidServiceName);
final Error invalidSnapshotIDMalformed = new Error();
invalidSnapshotIDMalformed.setName("InvalidSnapshotID.Malformed");
invalidSnapshotIDMalformed.setText("InvalidSnapshotID.Malformed");
serviceErrors.add(invalidSnapshotIDMalformed);
final Error invalidSnapshotInUse = new Error();
invalidSnapshotInUse.setName("InvalidSnapshot.InUse");
invalidSnapshotInUse.setText("InvalidSnapshot.InUse");
serviceErrors.add(invalidSnapshotInUse);
final Error invalidSnapshotNotFound = new Error();
invalidSnapshotNotFound.setName("InvalidSnapshot.NotFound");
invalidSnapshotNotFound.setText("InvalidSnapshot.NotFound");
serviceErrors.add(invalidSnapshotNotFound);
final Error invalidSpotDatafeedNotFound = new Error();
invalidSpotDatafeedNotFound.setName("InvalidSpotDatafeed.NotFound");
invalidSpotDatafeedNotFound.setText("InvalidSpotDatafeed.NotFound");
serviceErrors.add(invalidSpotDatafeedNotFound);
final Error invalidSpotFleetRequestConfig = new Error();
invalidSpotFleetRequestConfig.setName("InvalidSpotFleetRequestConfig");
invalidSpotFleetRequestConfig.setText("InvalidSpotFleetRequestConfig");
serviceErrors.add(invalidSpotFleetRequestConfig);
final Error invalidSpotFleetRequestIdMalformed = new Error();
invalidSpotFleetRequestIdMalformed.setName("InvalidSpotFleetRequestId.Malformed");
invalidSpotFleetRequestIdMalformed.setText("InvalidSpotFleetRequestId.Malformed");
serviceErrors.add(invalidSpotFleetRequestIdMalformed);
final Error invalidSpotFleetRequestIdNotFound = new Error();
invalidSpotFleetRequestIdNotFound.setName("InvalidSpotFleetRequestId.NotFound");
invalidSpotFleetRequestIdNotFound.setText("InvalidSpotFleetRequestId.NotFound");
serviceErrors.add(invalidSpotFleetRequestIdNotFound);
final Error invalidSpotInstanceRequestIDMalformed = new Error();
invalidSpotInstanceRequestIDMalformed.setName("InvalidSpotInstanceRequestID.Malformed");
invalidSpotInstanceRequestIDMalformed.setText("InvalidSpotInstanceRequestID.Malformed");
serviceErrors.add(invalidSpotInstanceRequestIDMalformed);
final Error invalidSpotInstanceRequestIDNotFound = new Error();
invalidSpotInstanceRequestIDNotFound.setName("InvalidSpotInstanceRequestID.NotFound");
invalidSpotInstanceRequestIDNotFound.setText("InvalidSpotInstanceRequestID.NotFound");
serviceErrors.add(invalidSpotInstanceRequestIDNotFound);
final Error invalidState = new Error();
invalidState.setName("InvalidState");
invalidState.setText("InvalidState");
serviceErrors.add(invalidState);
final Error invalidStateTransition = new Error();
invalidStateTransition.setName("InvalidStateTransition");
invalidStateTransition.setText("InvalidStateTransition");
serviceErrors.add(invalidStateTransition);
final Error invalidSubnetConflict = new Error();
invalidSubnetConflict.setName("InvalidSubnet.Conflict");
invalidSubnetConflict.setText("InvalidSubnet.Conflict");
serviceErrors.add(invalidSubnetConflict);
final Error invalidSubnetIDNotFound = new Error();
invalidSubnetIDNotFound.setName("InvalidSubnetID.NotFound");
invalidSubnetIDNotFound.setText("InvalidSubnetID.NotFound");
serviceErrors.add(invalidSubnetIDNotFound);
final Error invalidUserIDMalformed = new Error();
invalidUserIDMalformed.setName("InvalidUserID.Malformed");
invalidUserIDMalformed.setText("InvalidUserID.Malformed");
serviceErrors.add(invalidUserIDMalformed);
final Error invalidVolumeIDDuplicate = new Error();
invalidVolumeIDDuplicate.setName("InvalidVolumeID.Duplicate");
invalidVolumeIDDuplicate.setText("InvalidVolumeID.Duplicate");
serviceErrors.add(invalidVolumeIDDuplicate);
final Error invalidVolumeIDMalformed = new Error();
invalidVolumeIDMalformed.setName("InvalidVolumeID.Malformed");
invalidVolumeIDMalformed.setText("InvalidVolumeID.Malformed");
serviceErrors.add(invalidVolumeIDMalformed);
final Error invalidVolumeIDZoneMismatch = new Error();
invalidVolumeIDZoneMismatch.setName("InvalidVolumeID.ZoneMismatch");
invalidVolumeIDZoneMismatch.setText("InvalidVolumeID.ZoneMismatch");
serviceErrors.add(invalidVolumeIDZoneMismatch);
final Error invalidVolumeNotFound = new Error();
invalidVolumeNotFound.setName("InvalidVolume.NotFound");
invalidVolumeNotFound.setText("InvalidVolume.NotFound");
serviceErrors.add(invalidVolumeNotFound);
final Error invalidVolumeZoneMismatch = new Error();
invalidVolumeZoneMismatch.setName("InvalidVolume.ZoneMismatch");
invalidVolumeZoneMismatch.setText("InvalidVolume.ZoneMismatch");
serviceErrors.add(invalidVolumeZoneMismatch);
final Error invalidVpcEndpointIdMalformed = new Error();
invalidVpcEndpointIdMalformed.setName("InvalidVpcEndpointId.Malformed");
invalidVpcEndpointIdMalformed.setText("InvalidVpcEndpointId.Malformed");
serviceErrors.add(invalidVpcEndpointIdMalformed);
final Error invalidVpcEndpointIdNotFound = new Error();
invalidVpcEndpointIdNotFound.setName("InvalidVpcEndpointId.NotFound");
invalidVpcEndpointIdNotFound.setText("InvalidVpcEndpointId.NotFound");
serviceErrors.add(invalidVpcEndpointIdNotFound);
final Error invalidVpcIDNotFound = new Error();
invalidVpcIDNotFound.setName("InvalidVpcID.NotFound");
invalidVpcIDNotFound.setText("InvalidVpcID.NotFound");
serviceErrors.add(invalidVpcIDNotFound);
final Error invalidVpcPeeringConnectionIdMalformed = new Error();
invalidVpcPeeringConnectionIdMalformed.setName("InvalidVpcPeeringConnectionId.Malformed");
invalidVpcPeeringConnectionIdMalformed.setText("InvalidVpcPeeringConnectionId.Malformed");
serviceErrors.add(invalidVpcPeeringConnectionIdMalformed);
final Error invalidVpcPeeringConnectionIDNotFound = new Error();
invalidVpcPeeringConnectionIDNotFound.setName("InvalidVpcPeeringConnectionID.NotFound");
invalidVpcPeeringConnectionIDNotFound.setText("InvalidVpcPeeringConnectionID.NotFound");
serviceErrors.add(invalidVpcPeeringConnectionIDNotFound);
final Error invalidVpcRange = new Error();
invalidVpcRange.setName("InvalidVpc.Range");
invalidVpcRange.setText("InvalidVpc.Range");
serviceErrors.add(invalidVpcRange);
final Error invalidVpcState = new Error();
invalidVpcState.setName("InvalidVpcState");
invalidVpcState.setText("InvalidVpcState");
serviceErrors.add(invalidVpcState);
final Error invalidVpnConnectionID = new Error();
invalidVpnConnectionID.setName("InvalidVpnConnectionID");
invalidVpnConnectionID.setText("InvalidVpnConnectionID");
serviceErrors.add(invalidVpnConnectionID);
final Error invalidVpnConnectionIDNotFound = new Error();
invalidVpnConnectionIDNotFound.setName("InvalidVpnConnectionID.NotFound");
invalidVpnConnectionIDNotFound.setText("InvalidVpnConnectionID.NotFound");
serviceErrors.add(invalidVpnConnectionIDNotFound);
final Error invalidVpnGatewayAttachmentNotFound = new Error();
invalidVpnGatewayAttachmentNotFound.setName("InvalidVpnGatewayAttachment.NotFound");
invalidVpnGatewayAttachmentNotFound.setText("InvalidVpnGatewayAttachment.NotFound");
serviceErrors.add(invalidVpnGatewayAttachmentNotFound);
final Error invalidVpnGatewayIDNotFound = new Error();
invalidVpnGatewayIDNotFound.setName("InvalidVpnGatewayID.NotFound");
invalidVpnGatewayIDNotFound.setText("InvalidVpnGatewayID.NotFound");
serviceErrors.add(invalidVpnGatewayIDNotFound);
final Error invalidZoneNotFound = new Error();
invalidZoneNotFound.setName("InvalidZone.NotFound");
invalidZoneNotFound.setText("InvalidZone.NotFound");
serviceErrors.add(invalidZoneNotFound);
final Error legacySecurityGroup = new Error();
legacySecurityGroup.setName("LegacySecurityGroup");
legacySecurityGroup.setText("LegacySecurityGroup");
serviceErrors.add(legacySecurityGroup);
final Error maxIOPSLimitExceeded = new Error();
maxIOPSLimitExceeded.setName("MaxIOPSLimitExceeded");
maxIOPSLimitExceeded.setText("MaxIOPSLimitExceeded");
serviceErrors.add(maxIOPSLimitExceeded);
final Error maxSpotFleetRequestCountExceeded = new Error();
maxSpotFleetRequestCountExceeded.setName("MaxSpotFleetRequestCountExceeded");
maxSpotFleetRequestCountExceeded.setText("MaxSpotFleetRequestCountExceeded");
serviceErrors.add(maxSpotFleetRequestCountExceeded);
final Error maxSpotInstanceCountExceeded = new Error();
maxSpotInstanceCountExceeded.setName("MaxSpotInstanceCountExceeded");
maxSpotInstanceCountExceeded.setText("MaxSpotInstanceCountExceeded");
serviceErrors.add(maxSpotInstanceCountExceeded);
final Error networkAclEntryAlreadyExists = new Error();
networkAclEntryAlreadyExists.setName("NetworkAclEntryAlreadyExists");
networkAclEntryAlreadyExists.setText("NetworkAclEntryAlreadyExists");
serviceErrors.add(networkAclEntryAlreadyExists);
final Error networkAclEntryLimitExceeded = new Error();
networkAclEntryLimitExceeded.setName("NetworkAclEntryLimitExceeded");
networkAclEntryLimitExceeded.setText("NetworkAclEntryLimitExceeded");
serviceErrors.add(networkAclEntryLimitExceeded);
final Error networkAclLimitExceeded = new Error();
networkAclLimitExceeded.setName("NetworkAclLimitExceeded");
networkAclLimitExceeded.setText("NetworkAclLimitExceeded");
serviceErrors.add(networkAclLimitExceeded);
final Error nonEBSInstance = new Error();
nonEBSInstance.setName("NonEBSInstance");
nonEBSInstance.setText("NonEBSInstance");
serviceErrors.add(nonEBSInstance);
final Error notExportable = new Error();
notExportable.setName("NotExportable");
notExportable.setText("NotExportable");
serviceErrors.add(notExportable);
final Error operationNotPermitted = new Error();
operationNotPermitted.setName("OperationNotPermitted");
operationNotPermitted.setText("OperationNotPermitted");
serviceErrors.add(operationNotPermitted);
final Error outstandingVpcPeeringConnectionLimitExceeded = new Error();
outstandingVpcPeeringConnectionLimitExceeded.setName("OutstandingVpcPeeringConnectionLimitExceeded");
outstandingVpcPeeringConnectionLimitExceeded.setText("OutstandingVpcPeeringConnectionLimitExceeded");
serviceErrors.add(outstandingVpcPeeringConnectionLimitExceeded);
final Error pendingSnapshotLimitExceeded = new Error();
pendingSnapshotLimitExceeded.setName("PendingSnapshotLimitExceeded");
pendingSnapshotLimitExceeded.setText("PendingSnapshotLimitExceeded");
serviceErrors.add(pendingSnapshotLimitExceeded);
final Error privateIpAddressLimitExceeded = new Error();
privateIpAddressLimitExceeded.setName("PrivateIpAddressLimitExceeded");
privateIpAddressLimitExceeded.setText("PrivateIpAddressLimitExceeded");
serviceErrors.add(privateIpAddressLimitExceeded);
final Error requestResourceCountExceeded = new Error();
requestResourceCountExceeded.setName("RequestResourceCountExceeded");
requestResourceCountExceeded.setText("RequestResourceCountExceeded");
serviceErrors.add(requestResourceCountExceeded);
final Error reservedInstancesLimitExceeded = new Error();
reservedInstancesLimitExceeded.setName("ReservedInstancesLimitExceeded");
reservedInstancesLimitExceeded.setText("ReservedInstancesLimitExceeded");
serviceErrors.add(reservedInstancesLimitExceeded);
final Error resourceAlreadyAssociated = new Error();
resourceAlreadyAssociated.setName("Resource.AlreadyAssociated");
resourceAlreadyAssociated.setText("Resource.AlreadyAssociated");
serviceErrors.add(resourceAlreadyAssociated);
final Error resourceCountExceeded = new Error();
resourceCountExceeded.setName("ResourceCountExceeded");
resourceCountExceeded.setText("ResourceCountExceeded");
serviceErrors.add(resourceCountExceeded);
final Error resourceLimitExceeded = new Error();
resourceLimitExceeded.setName("ResourceLimitExceeded");
resourceLimitExceeded.setText("ResourceLimitExceeded");
serviceErrors.add(resourceLimitExceeded);
final Error routeAlreadyExists = new Error();
routeAlreadyExists.setName("RouteAlreadyExists");
routeAlreadyExists.setText("RouteAlreadyExists");
serviceErrors.add(routeAlreadyExists);
final Error routeLimitExceeded = new Error();
routeLimitExceeded.setName("RouteLimitExceeded");
routeLimitExceeded.setText("RouteLimitExceeded");
serviceErrors.add(routeLimitExceeded);
final Error routeTableLimitExceeded = new Error();
routeTableLimitExceeded.setName("RouteTableLimitExceeded");
routeTableLimitExceeded.setText("RouteTableLimitExceeded");
serviceErrors.add(routeTableLimitExceeded);
final Error rulesPerSecurityGroupLimitExceeded = new Error();
rulesPerSecurityGroupLimitExceeded.setName("RulesPerSecurityGroupLimitExceeded");
rulesPerSecurityGroupLimitExceeded.setText("RulesPerSecurityGroupLimitExceeded");
serviceErrors.add(rulesPerSecurityGroupLimitExceeded);
final Error securityGroupLimitExceeded = new Error();
securityGroupLimitExceeded.setName("SecurityGroupLimitExceeded");
securityGroupLimitExceeded.setText("SecurityGroupLimitExceeded");
serviceErrors.add(securityGroupLimitExceeded);
final Error securityGroupsPerInstanceLimitExceeded = new Error();
securityGroupsPerInstanceLimitExceeded.setName("SecurityGroupsPerInstanceLimitExceeded");
securityGroupsPerInstanceLimitExceeded.setText("SecurityGroupsPerInstanceLimitExceeded");
serviceErrors.add(securityGroupsPerInstanceLimitExceeded);
final Error securityGroupsPerInterfaceLimitExceeded = new Error();
securityGroupsPerInterfaceLimitExceeded.setName("SecurityGroupsPerInterfaceLimitExceeded");
securityGroupsPerInterfaceLimitExceeded.setText("SecurityGroupsPerInterfaceLimitExceeded");
serviceErrors.add(securityGroupsPerInterfaceLimitExceeded);
final Error snapshotLimitExceeded = new Error();
snapshotLimitExceeded.setName("SnapshotLimitExceeded");
snapshotLimitExceeded.setText("SnapshotLimitExceeded");
serviceErrors.add(snapshotLimitExceeded);
final Error subnetLimitExceeded = new Error();
subnetLimitExceeded.setName("SubnetLimitExceeded");
subnetLimitExceeded.setText("SubnetLimitExceeded");
serviceErrors.add(subnetLimitExceeded);
final Error tagLimitExceeded = new Error();
tagLimitExceeded.setName("TagLimitExceeded");
tagLimitExceeded.setText("TagLimitExceeded");
serviceErrors.add(tagLimitExceeded);
final Error unknownVolumeType = new Error();
unknownVolumeType.setName("UnknownVolumeType");
unknownVolumeType.setText("UnknownVolumeType");
serviceErrors.add(unknownVolumeType);
final Error unsupported = new Error();
unsupported.setName("Unsupported");
unsupported.setText("Unsupported");
serviceErrors.add(unsupported);
final Error unsupportedOperation = new Error();
unsupportedOperation.setName("UnsupportedOperation");
unsupportedOperation.setText("UnsupportedOperation");
serviceErrors.add(unsupportedOperation);
final Error volumeInUse = new Error();
volumeInUse.setName("VolumeInUse");
volumeInUse.setText("VolumeInUse");
serviceErrors.add(volumeInUse);
final Error volumeLimitExceeded = new Error();
volumeLimitExceeded.setName("VolumeLimitExceeded");
volumeLimitExceeded.setText("VolumeLimitExceeded");
serviceErrors.add(volumeLimitExceeded);
final Error volumeTypeNotAvailableInZone = new Error();
volumeTypeNotAvailableInZone.setName("VolumeTypeNotAvailableInZone");
volumeTypeNotAvailableInZone.setText("VolumeTypeNotAvailableInZone");
serviceErrors.add(volumeTypeNotAvailableInZone);
final Error vpcCidrConflict = new Error();
vpcCidrConflict.setName("VpcCidrConflict");
vpcCidrConflict.setText("VpcCidrConflict");
serviceErrors.add(vpcCidrConflict);
final Error vPCIdNotSpecified = new Error();
vPCIdNotSpecified.setName("VPCIdNotSpecified");
vPCIdNotSpecified.setText("VPCIdNotSpecified");
serviceErrors.add(vPCIdNotSpecified);
final Error vpcEndpointLimitExceeded = new Error();
vpcEndpointLimitExceeded.setName("VpcEndpointLimitExceeded");
vpcEndpointLimitExceeded.setText("VpcEndpointLimitExceeded");
serviceErrors.add(vpcEndpointLimitExceeded);
final Error vpcLimitExceeded = new Error();
vpcLimitExceeded.setName("VpcLimitExceeded");
vpcLimitExceeded.setText("VpcLimitExceeded");
serviceErrors.add(vpcLimitExceeded);
final Error vpcPeeringConnectionAlreadyExists = new Error();
vpcPeeringConnectionAlreadyExists.setName("VpcPeeringConnectionAlreadyExists");
vpcPeeringConnectionAlreadyExists.setText("VpcPeeringConnectionAlreadyExists");
serviceErrors.add(vpcPeeringConnectionAlreadyExists);
final Error vPCResourceNotSpecified = new Error();
vPCResourceNotSpecified.setName("VPCResourceNotSpecified");
vPCResourceNotSpecified.setText("VPCResourceNotSpecified");
serviceErrors.add(vPCResourceNotSpecified);
final Error vpnConnectionLimitExceeded = new Error();
vpnConnectionLimitExceeded.setName("VpnConnectionLimitExceeded");
vpnConnectionLimitExceeded.setText("VpnConnectionLimitExceeded");
serviceErrors.add(vpnConnectionLimitExceeded);
final Error vpnGatewayAttachmentLimitExceeded = new Error();
vpnGatewayAttachmentLimitExceeded.setName("VpnGatewayAttachmentLimitExceeded");
vpnGatewayAttachmentLimitExceeded.setText("VpnGatewayAttachmentLimitExceeded");
serviceErrors.add(vpnGatewayAttachmentLimitExceeded);
final Error vpnGatewayLimitExceeded = new Error();
vpnGatewayLimitExceeded.setName("VpnGatewayLimitExceeded");
vpnGatewayLimitExceeded.setText("VpnGatewayLimitExceeded");
serviceErrors.add(vpnGatewayLimitExceeded);
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,30 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.glacier;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import java.util.HashMap;
import java.util.Map;
public class GlacierRestJsonCppClientGenerator extends JsonCppClientGenerator {
public GlacierRestJsonCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
Map<String, String> customHeaders = new HashMap<>();
customHeaders.put("x-amz-glacier-version", serviceModel.getMetadata().getApiVersion());
serviceModel.getMetadata().setAdditionalHeaders(customHeaders);
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,36 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.lambda;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Operation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import com.google.common.collect.Sets;
import java.util.Set;
public class LambdaRestJsonCppClientGenerator extends JsonCppClientGenerator {
public LambdaRestJsonCppClientGenerator() throws Exception {
super();
}
@Override
protected Set<String> getOperationsToRemove() {
//InvokeAsync collides with our Async client generation.
//It is deprecated, so we're just not going to generate it
return Sets.newHashSet("InvokeAsync");
}
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
serviceModel.getShapes().remove("InvokeAsyncRequest");
serviceModel.getShapes().remove("InvokeAsyncResult");
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,34 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.machinelearning;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
public class MachineLearningJsonCppClientGenerator extends JsonCppClientGenerator {
public MachineLearningJsonCppClientGenerator() throws Exception {
super();
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/machinelearning/MachineLearningServiceClientSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,27 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.polly;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.generators.cpp.JsonCppClientGenerator;
import java.util.HashMap;
import java.util.Map;
public class PollyCppClientGenerator extends JsonCppClientGenerator {
public PollyCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
serviceModel.getOperations().get("SynthesizeSpeech").getRequest().getShape().setSupportsPresigning(true);
return super.generateSourceFiles(serviceModel);
}
}

View File

@@ -0,0 +1,47 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.rds;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.QueryCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class RDSCppClientGenerator extends QueryCppClientGenerator {
public RDSCppClientGenerator() throws Exception {
super();
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientHeader.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientSource.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,323 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.s3;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.RestXmlCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class S3RestXmlCppClientGenerator extends RestXmlCppClientGenerator {
private static Set<String> opsThatNeedMd5 = new HashSet<>();
private static Set<String> opsThatDoNotSupportVirtualAddressing = new HashSet<>();
private static Set<String> opsThatDoNotSupportArnEndpoint = new HashSet<>();
private static Set<String> bucketLocationConstraints = new HashSet<>();
static {
opsThatDoNotSupportVirtualAddressing.add("CreateBucket");
opsThatDoNotSupportVirtualAddressing.add("ListBuckets");
opsThatDoNotSupportArnEndpoint.add("CreateBucket");
opsThatDoNotSupportArnEndpoint.add("ListBuckets");
bucketLocationConstraints.add("us-east-1");
bucketLocationConstraints.add("us-east-2");
bucketLocationConstraints.add("us-west-1");
bucketLocationConstraints.add("us-west-2");
bucketLocationConstraints.add("eu-west-1");
bucketLocationConstraints.add("eu-west-2");
bucketLocationConstraints.add("eu-west-3");
bucketLocationConstraints.add("eu-central-1");
bucketLocationConstraints.add("ap-southeast-1");
bucketLocationConstraints.add("ap-southeast-2");
bucketLocationConstraints.add("ap-northeast-1");
bucketLocationConstraints.add("ap-northeast-2");
bucketLocationConstraints.add("ap-south-1");
bucketLocationConstraints.add("sa-east-1");
bucketLocationConstraints.add("cn-north-1");
bucketLocationConstraints.add("cn-northwest-1");
bucketLocationConstraints.add("ca-central-1");
bucketLocationConstraints.add("us-gov-west-1");
bucketLocationConstraints.add("eu-north-1");
}
public S3RestXmlCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
// Add ID2 and RequestId to GetObjectResult
hackGetObjectOutputResponse(serviceModel);
//size and content length should ALWAYS be 64 bit integers, if they aren't set them as that now.
serviceModel.getShapes().entrySet().stream().filter(shapeEntry -> shapeEntry.getKey().toLowerCase().equals("contentlength") || shapeEntry.getKey().toLowerCase().equals("size"))
.forEach(shapeEntry -> shapeEntry.getValue().setType("long"));
serviceModel.getOperations().values().stream()
.filter(operationEntry ->
!opsThatDoNotSupportVirtualAddressing.contains(operationEntry.getName()))
.forEach(operationEntry -> operationEntry.setVirtualAddressAllowed(true));
serviceModel.getOperations().values().stream()
.filter(operationEntry ->
!opsThatDoNotSupportVirtualAddressing.contains(operationEntry.getName()))
.forEach(operationEntry -> operationEntry.setVirtualAddressMemberName("Bucket"));
serviceModel.getOperations().values().stream()
.filter(operationEntry ->
!opsThatDoNotSupportArnEndpoint.contains(operationEntry.getName()))
.forEach(operationEntry -> operationEntry.setArnEndpointAllowed(true));
serviceModel.getOperations().values().stream()
.filter(operationEntry ->
!opsThatDoNotSupportArnEndpoint.contains(operationEntry.getName()))
.forEach(operationEntry -> operationEntry.setArnEndpointMemberName("Bucket"));
Shape locationConstraints = serviceModel.getShapes().get("BucketLocationConstraint");
if (locationConstraints != null) {
bucketLocationConstraints.stream()
.filter(enumEntry -> !locationConstraints.getEnumValues().contains(enumEntry))
.forEach(enumEntry -> locationConstraints.getEnumValues().add(enumEntry));
}
// Fix the typo of enum: "COMPLETE" for ReplicationStatus in API description, and "COMPLETED" is expected defined by S3 service.
// https://github.com/aws/aws-sdk-cpp/issues/859
Shape replicationStatus = serviceModel.getShapes().get("ReplicationStatus");
int indexOfComplete = replicationStatus.getEnumValues().indexOf("COMPLETE");
if (indexOfComplete != -1) {
replicationStatus.getEnumValues().set(indexOfComplete, "COMPLETED");
}
// Customized Log Information
Shape logTagKeyShape = new Shape();
logTagKeyShape.setName("customizedAccessLogTagKey");
logTagKeyShape.setType("string");
logTagKeyShape.setReferenced(true);
HashSet<String> keyReferencedBy = new HashSet<String>();
logTagKeyShape.setReferencedBy(keyReferencedBy);
ShapeMember shapeMemberKey = new ShapeMember();
shapeMemberKey.setShape(logTagKeyShape);
Shape logTagValShape = new Shape();
logTagValShape.setName("customizedAccessLogTagVal");
logTagValShape.setType("string");
logTagValShape.setReferenced(true);
HashSet<String> valReferencedBy = new HashSet<String>();
logTagValShape.setReferencedBy(valReferencedBy);
ShapeMember shapeMemberVal = new ShapeMember();
shapeMemberVal.setShape(logTagValShape);
Shape logTagShape = new Shape();
logTagShape.setName("customizedAccessLogTag");
logTagShape.setType("map");
logTagShape.setReferenced(true);
HashSet<String> tagReferencedBy = new HashSet<String>();
logTagShape.setReferencedBy(tagReferencedBy);
logTagKeyShape.getReferencedBy().add(logTagShape.getName());
logTagValShape.getReferencedBy().add(logTagShape.getName());
logTagShape.setMapKey(shapeMemberKey);
logTagShape.setMapValue(shapeMemberVal);
ShapeMember shapeMemberTag = new ShapeMember();
shapeMemberTag.setLocation("querystring");
shapeMemberTag.setCustomizedQuery(true);
shapeMemberTag.setShape(logTagShape);
serviceModel.getOperations().values().forEach(operationEntry -> {
if (operationEntry.getRequest() != null) {
operationEntry.getRequest().getShape().getMembers().put(logTagShape.getName(), shapeMemberTag);
operationEntry.getRequest().getShape().setCustomizedQuery(shapeMemberTag);
logTagShape.getReferencedBy().add(operationEntry.getRequest().getShape().getName());
}
});
return super.generateSourceFiles(serviceModel);
}
protected void hackGetObjectOutputResponse(ServiceModel serviceModel) {
Shape getObjectResult = serviceModel.getShapes().get("GetObjectResult");
if (getObjectResult == null) return;
Shape id2 = new Shape();
id2.setName("ObjectId2");
id2.setType("string");
if (serviceModel.getShapes().get("ObjectId2") == null) {
serviceModel.getShapes().put("ObjectId2", id2);
} else {
id2 = serviceModel.getShapes().get("ObjectId2");
}
Shape requestId = new Shape();
requestId.setName("ObjectRequestId");
requestId.setType("string");
if (serviceModel.getShapes().get("ObjectRequestId") == null) {
serviceModel.getShapes().put("ObjectRequestId", requestId);
} else {
requestId = serviceModel.getShapes().get("ObjectRequestId");
}
ShapeMember id2ShapeMember = new ShapeMember();
id2ShapeMember.setShape(id2);
id2ShapeMember.setLocation("header");
id2ShapeMember.setLocationName("x-amz-id-2");
ShapeMember requestIdShapeMember = new ShapeMember();
requestIdShapeMember.setShape(requestId);
requestIdShapeMember.setLocation("header");
requestIdShapeMember.setLocationName("x-amz-request-id");
if (getObjectResult.getMembers().get("Id2") == null) {
getObjectResult.getMembers().put("Id2", id2ShapeMember);
}
if (getObjectResult.getMembers().get("RequestId") == null) {
getObjectResult.getMembers().put("RequestId", requestIdShapeMember);
}
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientSource.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.Entry<String, Shape> shapeEntry) throws Exception {
Template template = null;
String fileName = "";
switch(shapeEntry.getKey()) {
case "GetBucketLocationResult": {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/GetBucketLocationResult.vm", StandardCharsets.UTF_8.name());
fileName = "source/model/GetBucketLocationResult.cpp";
break;
}
case "PutBucketNotificationConfigurationRequest": {
template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/PutBucketNotificationConfigurationRequest.vm", StandardCharsets.UTF_8.name());
fileName = "source/model/PutBucketNotificationConfigurationRequest.cpp";
break;
}
default:
return super.generateModelSourceFile(serviceModel, shapeEntry);
}
Shape shape = shapeEntry.getValue();
VelocityContext context = createContext(serviceModel);
context.put("shape", shape);
context.put("typeInfo", new CppShapeInformation(shape, serviceModel));
context.put("CppViewHelper", CppViewHelper.class);
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateErrorMarshallerHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ErrorMarshallerHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sErrorMarshaller.h",
serviceModel.getMetadata().getProjectName(), serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateErrorMarshallingSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ErrorMarshallerSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
String fileName = String.format("source/%sErrorMarshaller.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateRegionHeaderFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3EndpointEnumHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("exportValue", String.format("AWS_%s_API", serviceModel.getMetadata().getClassNamePrefix().toUpperCase()));
String fileName = String.format("include/aws/%s/%sEndpoint.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateRegionSourceFile(ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3EndpointEnumSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
String fileName = String.format("source/%sEndpoint.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateARNHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ARNHeader.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("exportValue", String.format("AWS_%s_API", serviceModel.getMetadata().getClassNamePrefix().toUpperCase()));
String fileName = String.format("include/aws/%s/%sARN.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateARNSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ARNSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
String fileName = String.format("source/%sARN.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,69 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.s3control;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppShapeInformation;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.RestXmlCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class S3ControlRestXmlCppClientGenerator extends RestXmlCppClientGenerator {
public S3ControlRestXmlCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
serviceModel.getOperations().values().stream()
.filter(operationEntry -> operationEntry.getRequest().getShape().hasAccountIdMembers())
.forEach(operationEntry -> operationEntry.setHasAccountIdInHostname(true));
serviceModel.getOperations().values().stream()
.filter(operationEntry -> operationEntry.getRequest().getShape().hasAccountIdMembers())
.forEach(operationEntry -> operationEntry.setAccountIdMemberName("AccountId"));
return super.generateSourceFiles(serviceModel);
}
@Override
protected SdkFileEntry generateClientHeaderFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientHeader.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("include/aws/%s/%sClient.h", serviceModel.getMetadata().getProjectName(),
serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientSource.vm");
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,55 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.cpp.sqs;
import com.amazonaws.util.awsclientgenerator.domainmodels.SdkFileEntry;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ServiceModel;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import com.amazonaws.util.awsclientgenerator.generators.cpp.QueryCppClientGenerator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
public class SQSQueryXmlCppClientGenerator extends QueryCppClientGenerator {
public SQSQueryXmlCppClientGenerator() throws Exception {
super();
}
@Override
public SdkFileEntry[] generateSourceFiles(ServiceModel serviceModel) throws Exception {
Shape queueAttributeNameShape = serviceModel.getShapes().get("QueueAttributeName");
//currently SQS doesn't model some values that can be returned as "members" of the QueueAttributeName enum
//this is not the right solution. The right solution is to add a separate enum for use for ReceiveMessageRequest
//but backwards compatibility and all that...
//anyways, add the missing values here.
if(queueAttributeNameShape != null) {
queueAttributeNameShape.getEnumValues().add("SentTimestamp");
queueAttributeNameShape.getEnumValues().add("ApproximateFirstReceiveTimestamp");
queueAttributeNameShape.getEnumValues().add("ApproximateReceiveCount");
queueAttributeNameShape.getEnumValues().add("SenderId");
}
return super.generateSourceFiles(serviceModel);
}
@Override
protected SdkFileEntry generateClientSourceFile(final ServiceModel serviceModel) throws Exception {
Template template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/sqs/SQSServiceClientSource.vm", StandardCharsets.UTF_8.name());
VelocityContext context = createContext(serviceModel);
context.put("CppViewHelper", CppViewHelper.class);
String fileName = String.format("source/%sClient.cpp", serviceModel.getMetadata().getClassNamePrefix());
return makeFile(template, context, fileName, true);
}
}

View File

@@ -0,0 +1,16 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.generators.exceptions;
public class SourceGenerationFailedException extends RuntimeException {
public SourceGenerationFailedException(String s) {
super(s);
}
public SourceGenerationFailedException(String s, Throwable throwable) {
super(s, throwable);
}
}

View File

@@ -0,0 +1,162 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator;
import com.amazonaws.util.awsclientgenerator.config.exceptions.GeneratorNotImplementedException;
import com.amazonaws.util.awsclientgenerator.generators.DirectFromC2jGenerator;
import com.amazonaws.util.awsclientgenerator.generators.MainClientGenerator;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class main {
static final String FILE_NAME = "inputfile";
static final String ARBITRARY_OPTION = "arbitrary";
static final String LANGUAGE_BINDING_OPTION = "language-binding";
static final String SERVICE_OPTION = "service";
static final String NAMESPACE = "namespace";
static final String LICENSE_TEXT = "license-text";
static final String STANDALONE_OPTION = "standalone";
static final String ENABLE_VIRTUAL_OPERATIONS = "enable-virtual-operations";
public static void main(String[] args) throws IOException {
if (args.length == 0 || getOptionName(args[0]).equals("help")) {
printHelp();
return;
}
Map<String, String> argPairs = getArgOptionPairs(args);
MainClientGenerator generator = new MainClientGenerator();
String arbitraryJson = null;
//At this point we want to read the c2j from std in.
//e.g. cat /home/henso/someC2jFile.normal.json | AWSClientGenerator --service myService --language-binding cpp or
//AWSClientGenerator --service myService --language-binding cpp < /home/henso/someC2jFile.normal.json
if (argPairs.containsKey(ARBITRARY_OPTION) || argPairs.containsKey(FILE_NAME)) {
if (!argPairs.containsKey(LANGUAGE_BINDING_OPTION) || argPairs.get(LANGUAGE_BINDING_OPTION).isEmpty()) {
System.out.println("Error: A language binding must be specified with the --arbitrary option.");
return;
}
if (!argPairs.containsKey(SERVICE_OPTION) || argPairs.get(SERVICE_OPTION).isEmpty()) {
System.out.println("Error: A service name must be specified with the --arbitrary option.");
return;
}
String namespace = "Aws";
if (argPairs.containsKey(NAMESPACE) && !argPairs.get(NAMESPACE).isEmpty()) {
namespace = argPairs.get(NAMESPACE);
}
String licenseText = "";
if (argPairs.containsKey(LICENSE_TEXT) && !argPairs.get(LICENSE_TEXT).isEmpty()) {
licenseText = argPairs.get(LICENSE_TEXT);
}
boolean generateStandalonePakckage = argPairs.containsKey(STANDALONE_OPTION);
String languageBinding = argPairs.get(LANGUAGE_BINDING_OPTION);
String serviceName = argPairs.get(SERVICE_OPTION);
boolean enableVirtualOperations = argPairs.containsKey(ENABLE_VIRTUAL_OPERATIONS);
//read from the piped input
try (InputStream stream = getInputStreamReader(argPairs)) {
StringBuilder stringBuilder = new StringBuilder();
byte[] buffer = new byte[1024];
while (stream.read(buffer) > 0) {
stringBuilder.append(new String(buffer, StandardCharsets.UTF_8));
}
arbitraryJson = stringBuilder.toString();
}
if (arbitraryJson != null && arbitraryJson.length() > 0) {
DirectFromC2jGenerator directFromC2jGenerator = new DirectFromC2jGenerator(generator);
try {
File outputLib = directFromC2jGenerator.generateSourceFromJson(arbitraryJson,
languageBinding,
serviceName,
namespace,
licenseText,
generateStandalonePakckage,
enableVirtualOperations);
System.out.println(outputLib.getAbsolutePath());
} catch (GeneratorNotImplementedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("You must supply standard input if you specify the --arbitrary option.");
}
return;
}
printHelp();
}
private static InputStream getInputStreamReader(Map<String, String> argsMap) throws FileNotFoundException, UnsupportedEncodingException {
if (argsMap.containsKey(FILE_NAME)) {
return new FileInputStream(argsMap.get(FILE_NAME));
}
return System.in;
}
private static void printHelp() {
System.out.println("Syntax: AWSClientGenerator <options>");
System.out.println("Example: cat /home/henso/someC2jFile.normal.json | AWSClientGenerator --service myService --language-binding cpp --arbitrary");
System.out.println("\tOptions:");
System.out.println("\t\t--help Print this message");
System.out.println("\t\t--arbitrary Reads the Coral To Json Doc from the std input. You must specify --language-binding and --service with this argument.");
System.out.println("\t\t--language-binding language binding to generate sdk for. If this is specified you must specify service and version arguments or you must specify --arbitrary");
System.out.println("\t\t--service service to generate service for. If this is specified, you must specify version and language-binding");
System.out.println("\t\t--version version of service to generate sdk for. If this is specified, you must specify language-binding and service.");
System.out.println("\t\t If you generate a specific SDK, the output will be the file where the sdk is stored in zip format");
}
private static String getOptionName(String optionStr) {
if (optionStr.contains("--")) {
return optionStr.substring(2).toLowerCase();
}
return "";
}
private static boolean isOption(String str) {
return !getOptionName(str).isEmpty();
}
/**
* If we have option pairs (e.g. --key value) then this will put them into the map as key to value. If the option
* does not take an argument, then the option is a key but the value will be empty.
*
* @param args cli args to parse.
* @return map of passed options and their arguments if they exist.
*/
private static Map<String, String> getArgOptionPairs(String[] args) {
Map<String, String> argsPairs = new HashMap<>();
for (int i = 0; i < args.length; ) {
String key = "", value = "";
if (isOption(args[i])) {
key = getOptionName(args[i]);
++i;
if (i < args.length && !isOption(args[i])) {
value = args[i];
++i;
}
argsPairs.put(key, value);
} else {
++i;
}
}
return argsPairs;
}
}

View File

@@ -0,0 +1,595 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.transform;
import com.amazonaws.util.awsclientgenerator.domainmodels.c2j.*;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Error;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.*;
import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp.CppViewHelper;
import org.apache.commons.lang.WordUtils;
import java.util.*;
import java.util.stream.Collectors;
public class C2jModelToGeneratorModelTransformer {
private final C2jServiceModel c2jServiceModel;
Map<String, Shape> shapes;
Set<String> removedShapes;
Set<String> removedOperations;
Map<String, Operation> operations;
Set<Error> allErrors;
boolean standalone;
boolean hasEndpointTrait;
boolean hasEndpointDiscoveryTrait;
String endpointOperationName;
public static final HashSet<String> UNSUPPORTEDHTMLTAGS = new HashSet<>();
static {
UNSUPPORTEDHTMLTAGS.add("<note>");
UNSUPPORTEDHTMLTAGS.add("</note>");
UNSUPPORTEDHTMLTAGS.add("<important>");
UNSUPPORTEDHTMLTAGS.add("</important>");
}
public C2jModelToGeneratorModelTransformer(C2jServiceModel c2jServiceModel, boolean standalone) {
this.c2jServiceModel = c2jServiceModel;
this.standalone = standalone;
}
public ServiceModel convert() {
ServiceModel serviceModel = new ServiceModel();
serviceModel.setMetadata(convertMetadata());
serviceModel.setVersion(c2jServiceModel.getVersion());
serviceModel.setDocumentation(formatDocumentation(c2jServiceModel.getDocumentation(), 3));
serviceModel.setServiceName(c2jServiceModel.getServiceName());
convertShapes();
convertOperations();
removeIgnoredOperations();
removeUnreferencedShapes();
postProcessShapes();
serviceModel.setShapes(shapes);
serviceModel.setOperations(operations);
serviceModel.setServiceErrors(allErrors);
serviceModel.getMetadata().setHasEndpointTrait(hasEndpointTrait);
serviceModel.getMetadata().setHasEndpointDiscoveryTrait(hasEndpointDiscoveryTrait && !endpointOperationName.isEmpty());
serviceModel.getMetadata().setEndpointOperationName(endpointOperationName);
return serviceModel;
}
String formatDocumentation(String documentation, int indentDepth) {
if(documentation != null) {
String tabString = "";
for(int i = 0; i < indentDepth; ++i) {
tabString += " ";
}
String wrappedString = WordUtils.wrap(documentation, 80, System.lineSeparator() + tabString + "* ", false);
wrappedString = wrappedString.replace("/*", "/ *").replace("*/", "* /");
for (String s : UNSUPPORTEDHTMLTAGS) {
wrappedString = wrappedString.replace(s, "");
}
return wrappedString;
}
return null;
}
String addDocCrossLinks(final String documentation, final String uid, final String shapeOrOperationName) {
if(documentation != null && uid != null) {
String seeAlsoRef = String.format("<p><h3>See Also:</h3> <a href=\"http://docs.aws.amazon.com/goto/WebAPI/%s/%s\">AWS API Reference</a></p>",
uid, shapeOrOperationName);
return documentation + seeAlsoRef;
}
return documentation;
}
void removeUnreferencedShapes() {
Iterator<String> iterator = shapes.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (shapes.get(key).getReferencedBy().isEmpty()) {
iterator.remove();
}
}
}
Metadata convertMetadata() {
C2jMetadata c2jMetadata = c2jServiceModel.getMetadata();
Metadata metadata = new Metadata();
metadata.setStandalone(standalone);
metadata.setApiVersion(c2jMetadata.getApiVersion());
metadata.setConcatAPIVersion(c2jMetadata.getApiVersion().replace("-", ""));
metadata.setSigningName(c2jMetadata.getSigningName() != null ? c2jMetadata.getSigningName() : c2jMetadata.getEndpointPrefix());
metadata.setServiceId(c2jMetadata.getServiceId() != null ? c2jMetadata.getServiceId() : c2jMetadata.getEndpointPrefix());
metadata.setJsonVersion(c2jMetadata.getJsonVersion());
if("api-gateway".equalsIgnoreCase(c2jMetadata.getProtocol())) {
metadata.setEndpointPrefix(c2jMetadata.getEndpointPrefix() + ".execute-api");
metadata.setProtocol("application-json");
metadata.setApigateway(true);
} else {
metadata.setEndpointPrefix(c2jMetadata.getEndpointPrefix());
metadata.setProtocol(c2jMetadata.getProtocol());
}
metadata.setNamespace(c2jMetadata.getServiceAbbreviation());
metadata.setServiceFullName(c2jMetadata.getServiceFullName());
metadata.setSignatureVersion(c2jMetadata.getSignatureVersion());
metadata.setTargetPrefix(c2jMetadata.getTargetPrefix());
metadata.setGlobalEndpoint(c2jMetadata.getGlobalEndpoint());
metadata.setTimestampFormat(c2jMetadata.getTimestampFormat());
if (metadata.getNamespace() == null || metadata.getNamespace().isEmpty()) {
metadata.setNamespace(sanitizeServiceAbbreviation(metadata.getServiceFullName()));
} else {
metadata.setNamespace(sanitizeServiceAbbreviation(metadata.getNamespace()));
}
metadata.setClassNamePrefix(CppViewHelper.convertToUpperCamel(ifNotNullOrEmpty(c2jMetadata.getClientClassNamePrefix(), metadata.getNamespace())));
c2jServiceModel.setServiceName(ifNotNullOrEmpty(c2jServiceModel.getServiceName(), c2jMetadata.getEndpointPrefix()));
metadata.setProjectName(ifNotNullOrEmpty(c2jMetadata.getClientProjectName(), c2jServiceModel.getServiceName()));
if(metadata.getProjectName().contains("."))
{
metadata.setProjectName(metadata.getProjectName().replace(".", ""));
}
return metadata;
}
static String ifNotNullOrEmpty(final String target, final String fallback) {
if (target != null && !target.isEmpty()){
return target;
} else {
return fallback;
}
}
void postProcessShapes() {
for(Map.Entry<String, Shape> entry : shapes.entrySet()) {
Shape shape = entry.getValue();
/*
If this shape ends up deriving from AmazonStreamingWebServiceRequest, then we already have implemented accessors for ContentType and the
header insertion there. So strip this out of the model (affects S3's PutObjectRequest).
*/
if (shape.hasStreamMembers() && shape.isRequest()) {
shape.RemoveMember("contentType");
shape.RemoveMember("ContentType");
}
}
}
void convertShapes() {
shapes = new LinkedHashMap<>(c2jServiceModel.getShapes().size());
removedShapes = new HashSet<String>();
// First pass adds basic information
for (Map.Entry<String, C2jShape> entry : c2jServiceModel.getShapes().entrySet()) {
Shape shape = convertShapeBasics(entry.getValue(), entry.getKey());
shapes.put(CppViewHelper.convertToUpperCamel(entry.getKey()), shape);
}
// Second Pass adds references to other shapes
for (Map.Entry<String, C2jShape> entry : c2jServiceModel.getShapes().entrySet()) {
Shape shape = shapes.get(CppViewHelper.convertToUpperCamel(entry.getKey()));
convertShapeReferences(entry.getValue(), shape);
}
}
Shape convertShapeBasics(C2jShape c2jShape, String shapeName) {
Shape shape = new Shape();
HashSet<String> shapesReferencedBy = new HashSet<String>();
shape.setReferencedBy(shapesReferencedBy);
shape.setName(CppViewHelper.convertToUpperCamel(shapeName));
String crossLinkedShapeDocs = addDocCrossLinks(c2jShape.getDocumentation(), c2jServiceModel.getMetadata().getUid(), shape.getName());
shape.setDocumentation(formatDocumentation(crossLinkedShapeDocs, 3));
if (c2jShape.getEnums() != null) {
shape.setEnumValues(new ArrayList<>(c2jShape.getEnums()));
} else {
shape.setEnumValues(Collections.emptyList());
}
shape.setMax(c2jShape.getMax());
shape.setMin(c2jShape.getMin());
shape.setType(c2jShape.getType());
shape.setLocationName(c2jShape.getLocationName());
shape.setPayload(c2jShape.getPayload());
shape.setFlattened(c2jShape.isFlattened());
shape.setSensitive(c2jShape.isSensitive());
if("timestamp".equalsIgnoreCase(shape.getType())) {
// shape's specific timestampFormat overrides the timestampFormat specified in metadata (if any)
shape.setTimestampFormat(c2jShape.getTimestampFormat() != null ?
c2jShape.getTimestampFormat() :
c2jServiceModel.getMetadata().getTimestampFormat());
}
shape.setEventStream(c2jShape.isEventstream());
shape.setEvent(c2jShape.isEvent());
shape.setException(c2jShape.isException());
if (c2jShape.getXmlNamespace() != null) {
XmlNamespace xmlns = new XmlNamespace();
xmlns.setUri(c2jShape.getXmlNamespace().getUri());
xmlns.setPrefix(c2jShape.getXmlNamespace().getPrefix());
shape.setXmlNamespace(xmlns);
}
return shape;
}
void convertShapeReferences(C2jShape c2jShape, Shape shape) {
if (removedShapes.contains(shape.getName())) {
return;
}
Map<String, ShapeMember> shapeMemberMap = new LinkedHashMap<>();
Set<String> required;
if (c2jShape.getRequired() != null) {
required = new LinkedHashSet<>(c2jShape.getRequired());
} else {
required = Collections.emptySet();
}
if (c2jShape.getMembers() != null) {
c2jShape.getMembers().entrySet().stream().filter(entry -> !entry.getValue().isDeprecated()).forEach(entry -> {
ShapeMember shapeMember = convertMember(entry.getValue(), shape, required.contains(entry.getKey()));
shapeMemberMap.put(entry.getKey(), shapeMember);
if (shapeMember.isHostLabel() && !shapeMember.getShape().isString()) {
throw new RuntimeException("Shape marked with 'hostLabel' should be of type 'string': " + shape.getName());
}
if (shapeMember.isEndpointDiscoveryId() && !shapeMember.getShape().isString()) {
throw new RuntimeException("Shape marked with 'endpointdiscoveryid' should be of type 'string': " + shape.getName());
}
});
}
shape.setMembers(shapeMemberMap);
// Shape is a List
if (c2jShape.getMember() != null && !c2jShape.getMember().isDeprecated()) {
shape.setListMember(convertMember(c2jShape.getMember(), shape, false));
}
if (c2jShape.getKey() != null && !c2jShape.getKey().isDeprecated()) {
shape.setMapKey(convertMember(c2jShape.getKey(), shape, false));
}
if (c2jShape.getValue() != null && !c2jShape.getValue().isDeprecated()) {
shape.setMapValue(convertMember(c2jShape.getValue(), shape, false));
}
}
ShapeMember convertMember(C2jShapeMember c2jShapeMember, Shape shape, boolean required) {
ShapeMember shapeMember = new ShapeMember();
shapeMember.setRequired(required);
shapeMember.setValidationNeeded(required);
shapeMember.setDocumentation(formatDocumentation(c2jShapeMember.getDocumentation(), 5));
shapeMember.setFlattened(c2jShapeMember.isFlattened());
Shape referencedShape = shapes.get(CppViewHelper.convertToUpperCamel(c2jShapeMember.getShape()));
referencedShape.getReferencedBy().add(shape.getName());
referencedShape.setReferenced(true);
shapeMember.setShape(referencedShape);
shapeMember.setLocationName(c2jShapeMember.getLocationName());
shapeMember.setLocation(c2jShapeMember.getLocation());
shapeMember.setQueryName(c2jShapeMember.getQueryName());
shapeMember.setStreaming(c2jShapeMember.isStreaming());
shapeMember.setIdempotencyToken(c2jShapeMember.isIdempotencyToken());
shapeMember.setEventPayload(c2jShapeMember.isEventpayload());
shapeMember.setHostLabel(c2jShapeMember.isHostLabel());
shapeMember.setEndpointDiscoveryId(c2jShapeMember.isEndpointdiscoveryid());
shapeMember.setXmlAttribute(c2jShapeMember.isXmlAttribute());
if(shapeMember.isStreaming()) {
shapeMember.setRequired(true);
shapeMember.setValidationNeeded(true);
}
if(shapeMember.isUsedForHeader()) {
shapeMember.setLocationName(shapeMember.getLocationName().toLowerCase());
}
if(c2jShapeMember.getXmlNamespace() != null) {
XmlNamespace xmlns = new XmlNamespace();
xmlns.setPrefix(c2jShapeMember.getXmlNamespace().getPrefix());
xmlns.setUri(c2jShapeMember.getXmlNamespace().getUri());
shapeMember.setXmlNamespace(xmlns);
}
return shapeMember;
}
void removeIgnoredOperations() {
// Backward propagation to mark all operations containing removed shapes.
for (String shapeName : removedShapes) {
markRemovedOperations(shapeName);
}
// Forward propagation to dereference all shapes related to the operations should be ignored.
for (String operationName : removedOperations) {
operations.get(operationName).getRequest().getShape().getReferencedBy().clear();
dereferenceShape(operations.get(operationName).getRequest().getShape());
operations.get(operationName).getResult().getShape().getReferencedBy().clear();
dereferenceShape(operations.get(operationName).getResult().getShape());
operations.remove(operationName);
}
}
void markRemovedOperations(String name) {
if (operations.containsKey(name)) {
removedOperations.add(name);
}
else if (shapes.containsKey(name)) {
Shape shapeShouldIgnore = shapes.get(name);
for (String shapeName : shapeShouldIgnore.getReferencedBy()) {
markRemovedOperations(shapeName);
}
shapeShouldIgnore.getReferencedBy().clear();
}
}
void dereferenceShape(Shape topShape) {
if (topShape.getMembers() == null) {
return;
}
for (Map.Entry<String, ShapeMember> entry : topShape.getMembers().entrySet()) {
entry.getValue().getShape().getReferencedBy().remove(topShape.getName());
if (entry.getValue().getShape().getReferencedBy().isEmpty()) {
dereferenceShape(entry.getValue().getShape());
}
}
}
void convertOperations() {
allErrors = new HashSet<>();
operations = new LinkedHashMap<>(c2jServiceModel.getOperations().size());
removedOperations = new HashSet<>();
for (Map.Entry<String, C2jOperation> entry : c2jServiceModel.getOperations().entrySet()) {
if(!entry.getValue().isDeprecated()) {
operations.put(entry.getKey(), convertOperation(entry.getValue()));
}
}
}
Operation convertOperation(C2jOperation c2jOperation) {
Operation operation = new Operation();
// name
operation.setName(c2jOperation.getName());
operation.setEndpointOperation(c2jOperation.isEndpointoperation());
operation.setHasEndpointDiscoveryTrait(c2jOperation.getEndpointdiscovery() == null ? false :true);
operation.setRequireEndpointDiscovery(operation.hasEndpointDiscoveryTrait() ? c2jOperation.getEndpointdiscovery().isRequired() : false);
if (operation.isEndpointOperation()) {
endpointOperationName = operation.getName();
}
if (operation.hasEndpointDiscoveryTrait()) {
hasEndpointDiscoveryTrait = true;
}
// Documentation
String crossLinkedShapeDocs =
addDocCrossLinks(c2jOperation.getDocumentation(), c2jServiceModel.getMetadata().getUid(), c2jOperation.getName());
operation.setDocumentation(formatDocumentation(crossLinkedShapeDocs, 9));
operation.setAuthtype(c2jOperation.getAuthtype());
operation.setAuthorizer(c2jOperation.getAuthorizer());
if (c2jOperation.getEndpoint() != null) {
operation.setEndpoint(convertEndpoint(c2jOperation.getEndpoint()));
hasEndpointTrait = true;
operation.setHasEndpointTrait(true);
}
// input
if (c2jOperation.getInput() != null) {
String requestName = c2jOperation.getName() + "Request";
Shape requestShape = renameShape(shapes.get(c2jOperation.getInput().getShape()), requestName);
requestShape.setRequest(true);
requestShape.setReferenced(true);
requestShape.getReferencedBy().add(c2jOperation.getName());
requestShape.setLocationName(c2jOperation.getInput().getLocationName());
if (c2jOperation.getInput().getXmlNamespace() != null) {
XmlNamespace xmlns = new XmlNamespace();
xmlns.setUri(c2jOperation.getInput().getXmlNamespace().getUri());
xmlns.setPrefix(c2jOperation.getInput().getXmlNamespace().getPrefix());
requestShape.setXmlNamespace(xmlns);
}
if(requestShape.getLocationName() != null && requestShape.getLocationName().length() > 0 &&
(requestShape.getPayload() == null || requestShape.getPayload().length() == 0) ) {
requestShape.setPayload(requestName);
}
requestShape.setSignBody(true);
if(operation.getAuthtype() == null) {
requestShape.setSignerName("Aws::Auth::SIGV4_SIGNER");
} else if (operation.getAuthtype().equals("v4-unsigned-body")) {
requestShape.setSignBody(false);
requestShape.setSignerName("Aws::Auth::SIGV4_SIGNER");
} else if (operation.getAuthtype().equals("custom")) {
requestShape.setSignerName("\"" + operation.getAuthorizer() + "\"");
} else {
requestShape.setSignerName("Aws::Auth::NULL_SIGNER");
}
if(c2jOperation.isHttpChecksumRequired()) {
requestShape.setComputeContentMd5(true);
}
ShapeMember requestMember = new ShapeMember();
requestMember.setShape(requestShape);
requestMember.setDocumentation(formatDocumentation(c2jOperation.getInput().getDocumentation(), 3));
// verify that member-refs in hostPrefix are all required members.
operation.setRequest(requestMember);
if (operation.getEndpoint() != null) {
List<String> requiredMembers = operation.getEndpoint().getMemberReferences();
for (int i = 0; i < requiredMembers.size(); i++) {
if (!requestShape.getMembers().get(requiredMembers.get(i)).isRequired()) {
throw new RuntimeException("HostPrefix member-ref should be Required. Operation: " + operation.getName() + ", member in Request: " + requiredMembers.get(i));
}
if (!requestShape.getMembers().get(requiredMembers.get(i)).isHostLabel()) {
throw new RuntimeException("HostPrefix member-ref should be marked with 'hostLabel'. Operation: " + operation.getName() + ", member in Request: " + requiredMembers.get(i));
}
}
}
}
// output
if (c2jOperation.getOutput() != null) {
String resultName = c2jOperation.getName() + "Result";
Shape resultShape = renameShape(shapes.get(c2jOperation.getOutput().getShape()), resultName);
resultShape.setResult(true);
resultShape.setReferenced(true);
resultShape.getReferencedBy().add(c2jOperation.getName());
ShapeMember resultMember = new ShapeMember();
resultMember.setShape(resultShape);
resultMember.setDocumentation(formatDocumentation(c2jOperation.getOutput().getDocumentation(), 3));
operation.setResult(resultMember);
}
// http
operation.setHttp(convertHttp(c2jOperation.getHttp()));
// errors
List<Error> operationErrors = new ArrayList<>();
if (c2jOperation.getErrors() != null) {
operationErrors.addAll(c2jOperation.getErrors().stream().map(c2jError -> convertError(c2jError, c2jOperation.getName())).collect(Collectors.toList()));
}
operation.setErrors(operationErrors);
return operation;
}
Shape renameShape(Shape shape, String name) {
if (shape.getName().equals(name)) {
return shape;
}
if (shapes.containsKey(name)) {
// Conflict with shape name defined by service team, need to rename it.
String newName = "";
switch(name) {
case "CopyObjectResult":
newName = "CopyObjectResultDetails";
renameShapeMember(shape, name, newName);
break;
case "BatchUpdateScheduleResult":
shapes.remove(name);
break;
default:
throw new RuntimeException("Unhandled shape name conflict: " + name);
}
}
Shape cloned = cloneShape(shape);
cloned.setName(name);
shapes.put(name, cloned);
return cloned;
}
Shape cloneShape(Shape shape) {
Shape cloned = new Shape();
cloned.setReferencedBy(shape.getReferencedBy());
cloned.setDocumentation(shape.getDocumentation());
cloned.setEnumValues(shape.getEnumValues());
cloned.setListMember(shape.getListMember());
cloned.setMapKey(shape.getMapKey());
cloned.setMapValue(shape.getMapValue());
cloned.setMax(shape.getMax());
cloned.setMin(shape.getMin());
cloned.setMembers(shape.getMembers());
cloned.setResult(shape.isResult());
cloned.setRequest(shape.isRequest());
cloned.setType(shape.getType());
cloned.setPayload(shape.getPayload());
cloned.setFlattened(shape.isFlattened());
cloned.setTimestampFormat(shape.getTimestampFormat());
cloned.setComputeContentMd5(shape.isComputeContentMd5());
cloned.setSupportsPresigning(shape.isSupportsPresigning());
cloned.setSignBody(shape.isSignBody());
cloned.setSignerName(shape.getSignerName());
cloned.setEventStream(shape.isEventStream());
cloned.setEvent(shape.isEvent());
cloned.setException(shape.isException());
cloned.setXmlNamespace(shape.getXmlNamespace());
return cloned;
}
void renameShapeMember(Shape parentShape, String originalName, String newName) {
shapes.get(originalName).setName(newName);
shapes.put(newName, shapes.get(originalName));
shapes.remove(originalName);
parentShape.getMembers().put(newName, parentShape.getMembers().get(originalName));
parentShape.RemoveMember(originalName);
parentShape.setPayload(newName);
}
Http convertHttp(C2jHttp c2jHttp) {
Http http = new Http();
http.setMethod(c2jHttp.getMethod());
http.setRequestUri(c2jHttp.getRequestUri());
http.setResponseCode(c2jHttp.getResponseCode());
return http;
}
Endpoint convertEndpoint(C2jEndpoint c2jEndpoint) {
Endpoint endpoint = new Endpoint();
endpoint.setHostPrefix(c2jEndpoint.getHostPrefix());
return endpoint;
}
Error convertError(C2jError c2jError, String operationName) {
Error error = new Error();
error.setModeled(false);
if(c2jServiceModel.getShapes().get(c2jError.getShape()) != null) {
C2jShape shape = c2jServiceModel.getShapes().get(c2jError.getShape());
c2jError.setError(shape.getError());
c2jError.setException(shape.isException());
Shape referencedShape = shapes.get(CppViewHelper.convertToUpperCamel(c2jError.getShape()));
referencedShape.getReferencedBy().add(operationName);
referencedShape.setReferenced(true);
// We define an error as a modeled error if:
// 1. Its shape is defined in C2J model.
// 2. For XML payload type, it has extra member other than "message" and "code" (case insensitive).
// 3. For JSON payload type, it has extra member other than "message" (case insensitive).
String errorPayloadType = CppViewHelper.computeServicePayloadType(this.c2jServiceModel.getMetadata().getProtocol());
if (errorPayloadType.equals("xml") && referencedShape.isXmlModeledException() ||
errorPayloadType.equals("json") && referencedShape.isJsonModeledException()) {
error.setModeled(true);
}
}
error.setDocumentation(formatDocumentation(c2jError.getDocumentation(), 3));
error.setName(CppViewHelper.convertToUpperCamel(c2jError.getShape()));
error.setText(c2jError.getShape());
error.setException(c2jError.isException());
error.setFault(c2jError.isFault());
error.setCoreError(CoreErrors.VARIANTS.containsKey(error.getName()));
//query xml loads this inner structure to do this work.
if (c2jError.getError() != null && c2jError.getError().getCode() != null) {
if(c2jError.getError().getHttpStatusCode() >= 500 || !c2jError.getError().isSenderFault()) {
error.setRetryable(true);
}
error.setText(c2jError.getError().getCode());
}
allErrors.add(error);
return error;
}
String sanitizeServiceAbbreviation(String serviceAbbreviation) {
return serviceAbbreviation.replace(" ", "").replace("-", "").replace("_", "").replace("Amazon", "").replace("AWS", "").replace("/", "");
}
}

View File

@@ -0,0 +1,75 @@
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package com.amazonaws.util.awsclientgenerator.transform;
import java.util.HashMap;
import java.util.Map;
public class CoreErrors
{
public static final HashMap<String, String> VARIANTS = new HashMap<>();
static {
VARIANTS.put("IncompleteSignature", "INCOMPLETE_SIGNATURE");
VARIANTS.put("IncompleteSignatureException", "INCOMPLETE_SIGNATURE");
VARIANTS.put("InternalFailure", "INTERNAL_FAILURE");
VARIANTS.put("InternalError", "INTERNAL_FAILURE");
VARIANTS.put("InternalFailureException", "INTERNAL_FAILURE");
VARIANTS.put("InvalidAction", "INVALID_ACTION");
VARIANTS.put("InvalidActionException", "INVALID_ACTION");
VARIANTS.put("InvalidClientTokenId", "INVALID_CLIENT_TOKEN_ID");
VARIANTS.put("InvalidClientTokenIdException", "INVALID_CLIENT_TOKEN_ID");
VARIANTS.put("InvalidParameterCombination", "INVALID_PARAMETER_COMBINATION");
VARIANTS.put("InvalidParameterCombinationException", "INVALID_PARAMETER_COMBINATION");
VARIANTS.put("InvalidParameterValue", "INVALID_PARAMETER_VALUE");
VARIANTS.put("InvalidParameterValueException", "INVALID_PARAMETER_VALUE");
VARIANTS.put("InvalidQueryParameter", "INVALID_QUERY_PARAMETER");
VARIANTS.put("InvalidQueryParameterException", "INVALID_QUERY_PARAMETER");
VARIANTS.put("MalformedQueryString", "MALFORMED_QUERY_STRING");
VARIANTS.put("MalformedQueryStringException", "MALFORMED_QUERY_STRING");
VARIANTS.put("MissingAction", "MISSING_ACTION");
VARIANTS.put("MissingActionException", "MISSING_ACTION");
VARIANTS.put("MissingAuthenticationToken", "MISSING_AUTHENTICATION_TOKEN");
VARIANTS.put("MissingAuthenticationTokenException", "MISSING_AUTHENTICATION_TOKEN");
VARIANTS.put("MissingParameter", "MISSING_PARAMETER");
VARIANTS.put("MissingParameterException", "MISSING_PARAMETER");
VARIANTS.put("OptInRequired", "OPT_IN_REQUIRED");
VARIANTS.put("OptInRequiredException", "OPT_IN_REQUIRED");
VARIANTS.put("RequestExpired", "REQUEST_EXPIRED");
VARIANTS.put("RequestExpiredException", "REQUEST_EXPIRED");
VARIANTS.put("ServiceUnavailable", "SERVICE_UNAVAILABLE");
VARIANTS.put("ServiceUnavailableException", "SERVICE_UNAVAILABLE");
VARIANTS.put("ServiceUnavailableError", "SERVICE_UNAVAILABLE");
VARIANTS.put("Throttling", "THROTTLING");
VARIANTS.put("ThrottlingException", "THROTTLING");
VARIANTS.put("ThrottledException", "THROTTLING");
VARIANTS.put("RequestThrottledException", "THROTTLING");
VARIANTS.put("RequestThrottled", "THROTTLING");
VARIANTS.put("ValidationError", "VALIDATION");
VARIANTS.put("ValidationErrorException", "VALIDATION");
VARIANTS.put("ValidationException", "VALIDATION");
VARIANTS.put("AccessDenied", "ACCESS_DENIED");
VARIANTS.put("AccessDeniedException", "ACCESS_DENIED");
VARIANTS.put("ResourceNotFound", "RESOURCE_NOT_FOUND");
VARIANTS.put("ResourceNotFoundException", "RESOURCE_NOT_FOUND");
VARIANTS.put("UnrecognizedClient", "UNRECOGNIZED_CLIENT");
VARIANTS.put("UnrecognizedClientException", "UNRECOGNIZED_CLIENT");
VARIANTS.put("InternalServerError", "INTERNAL_FAILURE");
VARIANTS.put("SlowDown", "SLOW_DOWN");
VARIANTS.put("SlowDownException", "SLOW_DOWN");
VARIANTS.put("RequestTimeTooSkewed", "REQUEST_TIME_TOO_SKEWED");
VARIANTS.put("RequestTimeTooSkewedException", "REQUEST_TIME_TOO_SKEWED");
VARIANTS.put("InvalidSignature", "INVALID_SIGNATURE");
VARIANTS.put("InvalidSignatureException", "INVALID_SIGNATURE");
VARIANTS.put("SignatureDoesNotMatch", "SIGNATURE_DOES_NOT_MATCH");
VARIANTS.put("SignatureDoesNotMatchException", "SIGNATURE_DOES_NOT_MATCH");
VARIANTS.put("InvalidAccessKeyId", "INVALID_ACCESS_KEY_ID");
VARIANTS.put("InvalidAccessKeyIdException", "INVALID_ACCESS_KEY_ID");
VARIANTS.put("RequestTimeout", "REQUEST_TIMEOUT");
VARIANTS.put("RequestTimeoutException", "REQUEST_TIMEOUT");
}
}

View File

@@ -0,0 +1,8 @@
#if($serviceModel.metadata.standalone)
$serviceModel.licenseText
#else
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#end

View File

@@ -0,0 +1,59 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#pragma once
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/core/AmazonSerializableWebServiceRequest.h>
\#include <aws/core/utils/UnreferencedParam.h>
\#include <aws/core/http/HttpRequest.h>
#if($serviceModel.hasStreamingRequestShapes())
\#include <aws/core/AmazonStreamingWebServiceRequest.h>
#end
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${metadata.classNamePrefix}Request : public Aws::AmazonSerializableWebServiceRequest
{
public:
virtual ~${metadata.classNamePrefix}Request () {}
void AddParametersToRequest(Aws::Http::HttpRequest& httpRequest) const { AWS_UNREFERENCED_PARAM(httpRequest); }
inline Aws::Http::HeaderValueCollection GetHeaders() const override
{
auto headers = GetRequestSpecificHeaders();
if(headers.size() == 0 || (headers.size() > 0 && headers.count(Aws::Http::CONTENT_TYPE_HEADER) == 0))
{
headers.emplace(Aws::Http::HeaderValuePair(Aws::Http::CONTENT_TYPE_HEADER, ${CppViewHelper.computeRequestContentType($metadata)} ));
#if($metadata.acceptHeader)
headers.emplace(Aws::Http::HeaderValuePair(Aws::Http::ACCEPT_HEADER, "${metadata.acceptHeader}"));
#end
}
#if($metadata.apiVersion)
headers.emplace(Aws::Http::HeaderValuePair(Aws::Http::API_VERSION_HEADER, "${metadata.apiVersion}"));
#end
#if($metadata.additionalHeaders)
#foreach($headerEntry in $metadata.additionalHeaders.entrySet())
headers.emplace(Aws::Http::HeaderValuePair("${headerEntry.key}", "${headerEntry.value}"));
#end
#end
return headers;
}
protected:
virtual Aws::Http::HeaderValueCollection GetRequestSpecificHeaders() const { return Aws::Http::HeaderValueCollection(); }
};
#if($serviceModel.hasStreamingRequestShapes())
typedef Aws::AmazonStreamingWebServiceRequest Streaming${metadata.classNamePrefix}Request;
#end
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,69 @@
void ${typeInfo.className}::AddQueryStringParameters(URI& uri) const
{
Aws::StringStream ss;
#foreach($memberEntry in $shape.members.entrySet())
#if($memberEntry.value.usedForQueryString && !$memberEntry.value.customizedQuery)
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberEntry.key))
#set($spaces = '')
#if(!$memberEntry.value.required)
if($CppViewHelper.computeVariableHasBeenSetName($memberEntry.key))
{
#set($spaces = ' ')
#end
#if($memberEntry.value.shape.enum)
${spaces}ss << ${memberEntry.value.shape.name}Mapper::GetNameFor${memberEntry.value.shape.name}(${memberVarName});
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#elseif($memberEntry.value.shape.timeStamp)
${spaces}ss << ${memberVarName}.ToGmtString(DateFormat::RFC822);
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#elseif($memberEntry.value.shape.map)
${spaces}for(auto& item : ${memberVarName})
${spaces}{
${spaces} ss << item.second;
${spaces} uri.AddQueryStringParameter(item.first.c_str(), ss.str());
${spaces} ss.str("");
${spaces}}
#elseif($memberEntry.value.shape.list)
${spaces}for(const auto& item : $memberVarName)
${spaces}{
#if($memberEntry.value.shape.listMember.shape.enum)
${spaces} ss << ${memberEntry.value.shape.listMember.shape.name}Mapper::GetNameFor${memberEntry.value.shape.listMember.shape.name}(item);
#else
${spaces} ss << item;
#end
${spaces} uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces} ss.str("");
${spaces}}
#else
${spaces}ss << ${memberVarName};
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#end
#if(!$memberEntry.value.required)
}
#end
#end
#end
#if($shape.customizedQuery)
if(!${CppViewHelper.computeMemberVariableName($shape.customizedQuery.shape.name)}.empty())
{
// only accept customized LogTag which starts with "x-"
Aws::Map<Aws::String, Aws::String> collectedLogTags;
for(const auto& entry: $CppViewHelper.computeMemberVariableName($shape.customizedQuery.shape.name))
{
if (!entry.first.empty() && !entry.second.empty() && entry.first.substr(0, 2) == "x-")
{
collectedLogTags.emplace(entry.first, entry.second);
}
}
if (!collectedLogTags.empty())
{
uri.AddQueryStringParameter(collectedLogTags);
}
}
#end
}

View File

@@ -0,0 +1,163 @@
#set($metadata = $serviceModel.metadata)
#if($metadata.standalone)
cmake_minimum_required (VERSION 3.1)
project(aws-cpp-sdk-${metadata.projectName})
find_package(AWSSDK REQUIRED COMPONENTS core)
if(CMAKE_HOST_APPLE)
set(CMAKE_MACOSX_RPATH TRUE)
endif()
set(BINARY_DIRECTORY "bin")
set(LIBRARY_DIRECTORY "lib")
set(INCLUDE_DIRECTORY "include")
if(BUILD_SHARED_LIBS)
set(ARCHIVE_DIRECTORY "bin")
message(STATUS "Building custom service as shared objects")
else()
set(ARCHIVE_DIRECTORY "lib")
message(STATUS "Building custom service as static objects")
endif()
set(PROJECT_VERSION 1.0)
#else
add_project(aws-cpp-sdk-${metadata.projectName} "C++ SDK for the AWS ${metadata.projectName} service" aws-cpp-sdk-core)
#end
#set($projectNameCaps = $metadata.projectName.toUpperCase())
file(GLOB AWS_${projectNameCaps}_HEADERS
"include/aws/${metadata.projectName}/*.h"
)
file(GLOB AWS_${projectNameCaps}_MODEL_HEADERS
"include/aws/${metadata.projectName}/model/*.h"
)
file(GLOB AWS_${projectNameCaps}_SOURCE
"source/*.cpp"
)
file(GLOB AWS_${projectNameCaps}_MODEL_SOURCE
"source/model/*.cpp"
)
#set($cmakeVarStart = "${")
file(GLOB ${projectNameCaps}_UNIFIED_HEADERS
${cmakeVarStart}AWS_${projectNameCaps}_HEADERS}
${cmakeVarStart}AWS_${projectNameCaps}_MODEL_HEADERS}
)
file(GLOB ${projectNameCaps}_UNITY_SRC
${cmakeVarStart}AWS_${projectNameCaps}_SOURCE}
${cmakeVarStart}AWS_${projectNameCaps}_MODEL_SOURCE}
)
if(ENABLE_UNITY_BUILD)
enable_unity_build("${projectNameCaps}" ${projectNameCaps}_UNITY_SRC)
endif()
file(GLOB ${projectNameCaps}_SRC
${cmakeVarStart}${projectNameCaps}_UNIFIED_HEADERS}
${cmakeVarStart}${projectNameCaps}_UNITY_SRC}
)
#set($dirDelim = "\\")
if(WIN32)
\#if we are compiling for visual studio, create a sane directory tree.
if(MSVC)
source_group("Header Files${dirDelim}aws${dirDelim}${metadata.projectName}" FILES ${cmakeVarStart}AWS_${projectNameCaps}_HEADERS})
source_group("Header Files${dirDelim}aws${dirDelim}${metadata.projectName}${dirDelim}model" FILES ${cmakeVarStart}AWS_${projectNameCaps}_MODEL_HEADERS})
source_group("Source Files" FILES ${cmakeVarStart}AWS_${projectNameCaps}_SOURCE})
source_group("Source Files${dirDelim}model" FILES ${cmakeVarStart}AWS_${projectNameCaps}_MODEL_SOURCE})
endif(MSVC)
endif()
set(${projectNameCaps}_INCLUDES
"${cmakeVarStart}CMAKE_CURRENT_SOURCE_DIR}/include/"
)
add_library(${PROJECT_NAME} ${cmakeVarStart}${projectNameCaps}_SRC})
add_library(AWS::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
set_compiler_flags(${PROJECT_NAME})
set_compiler_warnings(${PROJECT_NAME})
if(USE_WINDOWS_DLL_SEMANTICS AND BUILD_SHARED_LIBS)
target_compile_definitions(${PROJECT_NAME} PRIVATE "AWS_${metadata.classNamePrefix.toUpperCase()}_EXPORTS")
endif()
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
#if($metadata.standalone)
target_link_libraries(${PROJECT_NAME} PRIVATE ${AWSSDK_LINK_LIBRARIES})
if(USE_WINDOWS_DLL_SEMANTICS)
target_compile_definitions(${PROJECT_NAME} PUBLIC "USE_WINDOWS_DLL_SEMANTICS")
if(BUILD_SHARED_LIBS)
target_compile_definitions(${PROJECT_NAME} PUBLIC "USE_IMPORT_EXPORT=1")
endif()
endif()
if(USE_GCC_FLAGS)
target_compile_options(${PROJECT_NAME} PUBLIC -std=c++${CPP_STANDARD})
if(NOT ENABLE_RTTI)
target_compile_options(${PROJECT_NAME} PUBLIC -fno-rtti)
endif()
else()
if(NOT ENABLE_RTTI)
target_compile_options(${PROJECT_NAME} PUBLIC /GR-)
endif()
endif()
install(TARGETS ${PROJECT_NAME}
EXPORT "${PROJECT_NAME}-config"
ARCHIVE DESTINATION ${ARCHIVE_DIRECTORY}
LIBRARY DESTINATION ${LIBRARY_DIRECTORY}
RUNTIME DESTINATION ${BINARY_DIRECTORY} )
#else
target_link_libraries(${PROJECT_NAME} PRIVATE ${PLATFORM_DEP_LIBS} ${PROJECT_LIBS})
setup_install()
#end
install (FILES ${cmakeVarStart}AWS_${projectNameCaps}_HEADERS} DESTINATION ${INCLUDE_DIRECTORY}/aws/${metadata.projectName})
install (FILES ${cmakeVarStart}AWS_${projectNameCaps}_MODEL_HEADERS} DESTINATION ${INCLUDE_DIRECTORY}/aws/${metadata.projectName}/model)
#if($metadata.standalone)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
export(EXPORT "${PROJECT_NAME}-config"
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
)
set(ConfigPackageLocation "${LIBRARY_DIRECTORY}/cmake/${PROJECT_NAME}")
install(EXPORT "${PROJECT_NAME}-config"
FILE "${PROJECT_NAME}-config.cmake"
DESTINATION ${ConfigPackageLocation}
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
DESTINATION
${ConfigPackageLocation}
COMPONENT
Devel
)
#else
do_packaging()
#end

View File

@@ -0,0 +1,21 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#pragma once
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/core/Region.h>
\#include <aws/core/utils/memory/stl/AWSString.h>
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace ${metadata.classNamePrefix}Endpoint
{
${exportValue} Aws::String ForRegion(const Aws::String& regionName, bool useDualStack = false);
} // namespace ${metadata.classNamePrefix}Endpoint
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,105 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#set($endpointPrefix = $metadata.endpointPrefix)
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Endpoint.h>
\#include <aws/core/utils/memory/stl/AWSStringStream.h>
\#include <aws/core/utils/HashingUtils.h>
using namespace Aws;
using namespace ${rootNamespace}::${serviceNamespace};
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace ${metadata.classNamePrefix}Endpoint
{
#if(!$metadata.globalEndpoint)
static const int CN_NORTH_1_HASH = Aws::Utils::HashingUtils::HashString("cn-north-1");
static const int CN_NORTHWEST_1_HASH = Aws::Utils::HashingUtils::HashString("cn-northwest-1");
static const int US_ISO_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-iso-east-1");
static const int US_ISOB_EAST_1_HASH = Aws::Utils::HashingUtils::HashString("us-isob-east-1");
#end
#foreach($regionEndpointPair in $endpointMapping.entrySet())
#set($customizedRegion = $regionEndpointPair.key)
#if ($metadata.globalEndpoint || !($customizedRegion.equals("cn-north-1") || $customizedRegion.equals("cn-northwest-1") || $customizedRegion.equals("us-iso-east-1") || $customizedRegion.equals("us-isob-east-1")))
static const int ${regionEndpointPair.key.toUpperCase().replace("-", "_")}_HASH = Aws::Utils::HashingUtils::HashString("${regionEndpointPair.key}");
#end
#end
Aws::String ForRegion(const Aws::String& regionName, bool useDualStack)
{
#if($metadata.globalEndpoint)
#if($endpointMapping.isEmpty())
AWS_UNREFERENCED_PARAM(regionName);
AWS_UNREFERENCED_PARAM(useDualStack);
return "${metadata.globalEndpoint}";
#else
auto hash = Aws::Utils::HashingUtils::HashString(regionName.c_str());
if(!useDualStack)
{
#foreach($regionEndpointPair in $endpointMapping.entrySet())
if(hash == ${regionEndpointPair.key.toUpperCase().replace("-", "_")}_HASH)
{
return "${regionEndpointPair.value}";
}
#end
}
return "${metadata.globalEndpoint}";
#end##end if endpoint mapping
#else##no global endpoint means standard endpoints calculation except for special regions
// Fallback to us-east-1 if global endpoint does not exists.
Aws::String region = regionName == Aws::Region::AWS_GLOBAL ? Aws::Region::US_EAST_1 : regionName;
auto hash = Aws::Utils::HashingUtils::HashString(region.c_str());
#if(!$endpointMapping.isEmpty())
if(!useDualStack)
{
#foreach($regionEndpointPair in $endpointMapping.entrySet())
if(hash == ${regionEndpointPair.key.toUpperCase().replace("-", "_")}_HASH)
{
return "${regionEndpointPair.value}";
}
#end
}
#end
Aws::StringStream ss;
ss << "${endpointPrefix}" << ".";
if(useDualStack)
{
ss << "dualstack.";
}
ss << region;
if (hash == CN_NORTH_1_HASH || hash == CN_NORTHWEST_1_HASH)
{
ss << ".amazonaws.com.cn";
}
else if (hash == US_ISO_EAST_1_HASH)
{
ss << ".c2s.ic.gov";
}
else if (hash == US_ISOB_EAST_1_HASH)
{
ss << ".sc2s.sgov.gov";
}
else
{
ss << ".amazonaws.com";
}
return ss.str();
#end
}
} // namespace ${metadata.classNamePrefix}Endpoint
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,18 @@
#set($enumSize = $enumModel.members.size())
#set($count = 1)
enum class ${enumModel.name}
{
NOT_SET,
#foreach($enumMember in $enumModel.members)
${enumMember.memberName}#if($count < $enumSize),${nl}#end
#set($count = $count + 1)
#end
};
namespace ${enumModel.name}Mapper
{
${typeInfo.exportValue} ${enumModel.name} Get${enumModel.name}ForName(const Aws::String& name);
${typeInfo.exportValue} Aws::String GetNameFor${enumModel.name}(${enumModel.name} value);
} // namespace ${enumModel.name}Mapper

View File

@@ -0,0 +1,161 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/${metadata.projectName}/model/${enumModel.name}.h>
\#include <aws/core/utils/HashingUtils.h>
\#include <aws/core/Globals.h>
\#include <aws/core/utils/EnumParseOverflowContainer.h>
using namespace Aws::Utils;
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace Model
{
namespace ${enumModel.name}Mapper
{
#foreach($enumMember in $enumModel.members)
static const int ${enumMember.memberName}_HASH = HashingUtils::HashString("${enumMember.memberStringValue}");
#end
#if ($enumModel.members.size() > 121)
/*
The if-else chains in this file are converted into a jump table by the compiler,
which allows constant time lookup. The chain has been broken into helper functions
because MSVC has a maximum of 122 chained if-else blocks.
*/
#set ($enumCounter = 0)
#foreach($enum in $enumModel.members)
#if ($enumCounter % 122 == 0)
#set($elseText = "")
#set ($helperIndex = $enumCounter / 122)
static bool GetEnumForNameHelper${helperIndex}(int hashCode, ${enumModel.name}& enumValue)
{
#end
${elseText}if (hashCode == ${enum.memberName}_HASH)
{
enumValue = ${enumModel.name}::${enum.memberName};
return true;
}
#set($elseText = "else ")
#set ($enumCounter = $enumCounter + 1)
#if ($enumCounter % 122 == 0 || $enumCounter == $enumModel.members.size())
return false;
}
#end
#end
#set ($enumCounter = 0)
#foreach($enum in $enumModel.members)
#if ($enumCounter % 122 == 0)
#set($elseText = "")
#set ($helperIndex = $enumCounter / 122)
static bool GetNameForEnumHelper${helperIndex}(${enumModel.name} enumValue, Aws::String& value)
{
switch(enumValue)
{
#end
case ${enumModel.name}::${enum.memberName}:
value = "${enum.memberStringValue}";
return true;
#set ($enumCounter = $enumCounter + 1)
#if ($enumCounter % 122 == 0 || $enumCounter == $enumModel.members.size())
default:
return false;
}
}
#end
#end
#end
${enumModel.name} Get${enumModel.name}ForName(const Aws::String& name)
{
int hashCode = HashingUtils::HashString(name.c_str());
#if($enumModel.members.size() > 0 && $enumModel.members.size() < 122)
#set($elseText = "")
#foreach($enumMember in $enumModel.members)
${elseText}if (hashCode == ${enumMember.memberName}_HASH)
{
return ${enumModel.name}::${enumMember.memberName};
}
#set($elseText = "else ")
#end
EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
if(overflowContainer)
{
overflowContainer->StoreOverflow(hashCode, name);
return static_cast<${enumModel.name}>(hashCode);
}
return ${enumModel.name}::NOT_SET;
#else
#set($elseText = "")
#set($maxHelperIndex = $enumModel.members.size() / 122)
${enumModel.name} enumValue;
#foreach($helperIndex in [0..$maxHelperIndex])
${elseText}if (GetEnumForNameHelper${helperIndex}(hashCode, enumValue))
{
return enumValue;
}
#set($elseText = "else ")
#end
EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
if(overflowContainer)
{
overflowContainer->StoreOverflow(hashCode, name);
return static_cast<${enumModel.name}>(hashCode);
}
return ${enumModel.name}::NOT_SET;
#end
}
Aws::String GetNameFor${enumModel.name}(${enumModel.name} enumValue)
{
#if($enumModel.members.size() > 0 && $enumModel.members.size() < 122)
switch(enumValue)
{
#foreach($enumMember in $enumModel.members)
case ${enumModel.name}::${enumMember.memberName}:
return "${enumMember.memberStringValue}";
#end
default:
EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
if(overflowContainer)
{
return overflowContainer->RetrieveOverflow(static_cast<int>(enumValue));
}
return {};
}
#else
#set($maxHelperIndex = $enumModel.members.size() / 122)
Aws::String value;
#set($elseText = "")
#foreach($helperIndex in [0..$maxHelperIndex])
${elseText}if (GetNameForEnumHelper${helperIndex}(enumValue, value))
{
return value;
}
#set($elseText = "else ")
#end
EnumParseOverflowContainer* overflowContainer = Aws::GetEnumOverflowContainer();
if(overflowContainer)
{
return overflowContainer->RetrieveOverflow(static_cast<int>(enumValue));
}
return {};
#end
}
} // namespace ${enumModel.name}Mapper
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,83 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#pragma once
\#include <aws/core/client/AWSError.h>
\#include <aws/core/client/CoreErrors.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
#set($enumClassName = "${metadata.classNamePrefix}Errors")
enum class $enumClassName
{
//From Core//
//////////////////////////////////////////////////////////////////////////////////////////
INCOMPLETE_SIGNATURE = 0,
INTERNAL_FAILURE = 1,
INVALID_ACTION = 2,
INVALID_CLIENT_TOKEN_ID = 3,
INVALID_PARAMETER_COMBINATION = 4,
INVALID_QUERY_PARAMETER = 5,
INVALID_PARAMETER_VALUE = 6,
MISSING_ACTION = 7, // SDK should never allow
MISSING_AUTHENTICATION_TOKEN = 8, // SDK should never allow
MISSING_PARAMETER = 9, // SDK should never allow
OPT_IN_REQUIRED = 10,
REQUEST_EXPIRED = 11,
SERVICE_UNAVAILABLE = 12,
THROTTLING = 13,
VALIDATION = 14,
ACCESS_DENIED = 15,
RESOURCE_NOT_FOUND = 16,
UNRECOGNIZED_CLIENT = 17,
MALFORMED_QUERY_STRING = 18,
SLOW_DOWN = 19,
REQUEST_TIME_TOO_SKEWED = 20,
INVALID_SIGNATURE = 21,
SIGNATURE_DOES_NOT_MATCH = 22,
INVALID_ACCESS_KEY_ID = 23,
REQUEST_TIMEOUT = 24,
NETWORK_CONNECTION = 99,
UNKNOWN = 100,
///////////////////////////////////////////////////////////////////////////////////////////
#set($enum_size = 0)
#foreach($error in $errorConstNames)
#set($enum_size = $enum_size + 1)
#end
#set($enum_counter = 1)
#foreach($errorConstName in $errorConstNames)
$errorConstName#if($enum_counter == 1)= static_cast<int>(Aws::Client::CoreErrors::SERVICE_EXTENSION_START_RANGE) + 1#end#if($enum_counter < $enum_size),${nl}#end
#set($enum_counter = $enum_counter + 1)
#end
};
#set($className = "${metadata.classNamePrefix}Error")
class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} $className : public Aws::Client::AWSError<$enumClassName>
{
public:
$className() {}
$className(const Aws::Client::AWSError<Aws::Client::CoreErrors>& rhs) : Aws::Client::AWSError<$enumClassName>(rhs) {}
$className(Aws::Client::AWSError<Aws::Client::CoreErrors>&& rhs) : Aws::Client::AWSError<$enumClassName>(rhs) {}
$className(const Aws::Client::AWSError<$enumClassName>& rhs) : Aws::Client::AWSError<$enumClassName>(rhs) {}
$className(Aws::Client::AWSError<$enumClassName>&& rhs) : Aws::Client::AWSError<$enumClassName>(rhs) {}
template <typename T>
T GetModeledError();
};
namespace ${metadata.classNamePrefix}ErrorMapper
{
${CppViewHelper.computeExportValue($metadata.classNamePrefix)} Aws::Client::AWSError<Aws::Client::CoreErrors> GetErrorForName(const char* errorName);
}
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,67 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#set($memberKeyWithFirstLetterCapitalized = $CppViewHelper.capitalizeFirstChar(${blobMember.key}))
#set($memberVariableName = $CppViewHelper.computeMemberVariableName($blobMember.key))
#set($memberDocumentation ="/**${nl} * ${blobMember.value.documentation}${nl} */")
#set($required = "${CppViewHelper.computeVariableHasBeenSetName($blobMember.key)} = true; ")
#set($cppType = "const Aws::Vector<unsigned char>&")
#set($moveType = "Aws::Vector<unsigned char>&&")
#set($classNameRef = "${typeInfo.className}&")
\#include <aws/$metadata.projectName/${metadata.classNamePrefix}_EXPORTS.h>
#foreach($header in $typeInfo.headerIncludes)
\#include $header
#end
namespace Aws
{
#if ($rootNamespace != "Aws")
} // namespace Aws
namespace ${rootNamespace}
{
#end
namespace ${serviceNamespace}
{
namespace Model
{
#if($shape.documentation)
/**
* $shape.documentation
*/
#end
class $typeInfo.exportValue $typeInfo.className
{
public:
${typeInfo.className}() = default;
${typeInfo.className}(Aws::Vector<unsigned char>&& value) { ${memberVariableName} = std::move(value); }
$memberDocumentation
inline ${cppType} Get${memberKeyWithFirstLetterCapitalized}() const { return ${memberVariableName}; }
$memberDocumentation
inline ${moveType} Get${memberKeyWithFirstLetterCapitalized}WithOwnership() { return std::move(${memberVariableName}); }
$memberDocumentation
inline void Set${memberKeyWithFirstLetterCapitalized}(${cppType} value) { ${required}${memberVariableName} = value; }
$memberDocumentation
inline void Set${memberKeyWithFirstLetterCapitalized}(${moveType} value) { ${required}${memberVariableName} = std::move(value); }
$memberDocumentation
inline ${classNameRef} With${memberKeyWithFirstLetterCapitalized}(${cppType} value) { Set${memberKeyWithFirstLetterCapitalized}(value); return *this;}
$memberDocumentation
inline ${classNameRef} With${memberKeyWithFirstLetterCapitalized}(${moveType} value) { Set${memberKeyWithFirstLetterCapitalized}(std::move(value)); return *this;}
private:
Aws::Vector<unsigned char> $memberVariableName;
bool ${CppViewHelper.computeVariableHasBeenSetName($blobMember.key)};
};
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,54 @@
#set($first = 0)
#foreach($entry in $shape.members.entrySet())
#if($entry.value.usedForHeader)
#if($first == 0)
Aws::StringStream ss;
#set($first = 1)
#end
#set($spaces = '')
#set($memberName = $entry.key)
#set($member = $entry.value)
#set($locationName = $member.locationName)
#if($member.usedForHeader)
#set($lowerCaseVarName = $CppViewHelper.computeVariableName($memberName))
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberName))
#set($varNameHasBeenSet = $CppViewHelper.computeVariableHasBeenSetName($memberName))
#if(!$member.required && $useRequiredField)
#set($spaces = ' ')
if($varNameHasBeenSet)
{
#end
#if($member.shape.enum)
${spaces}headers.emplace("${locationName}", ${member.shape.name}Mapper::GetNameFor${member.shape.name}($memberVarName));
#elseif($member.shape.blob)
${spaces}ss << HashingUtils::Base64Encode(m_${lowerCaseVarName});
${spaces}headers.emplace("${locationName}", ss.str());
${spaces}ss.str("");
#elseif($member.shape.timeStamp)
${spaces}headers.emplace("${locationName}", m_${lowerCaseVarName}.ToGmtString(DateFormat::RFC822));
#elseif($member.shape.map)
${spaces}for(const auto& item : $memberVarName)
${spaces}{
${spaces} ss << "${locationName}" << item.first;
${spaces} headers.emplace(ss.str(), item.second);
${spaces} ss.str("");
${spaces}}
#elseif($member.shape.list)
${spaces}for(const auto& item : $memberVarName)
${spaces}{
${spaces} ss << item;
${spaces} headers.emplace("${locationName}", ss.str());
${spaces} ss.str("");
${spaces}}
#else
${spaces}ss << m_${lowerCaseVarName};
${spaces}headers.emplace("${locationName}", #if($member.requiresHeaderEncoding())URI::URLEncodePath(ss.str())#else ss.str()#end);
${spaces}ss.str("");
#end
#if(!$member.required && $useRequiredField)
}
#end
#end
#end
#end

View File

@@ -0,0 +1,229 @@
#foreach($member in $shape.members.entrySet())
#set($moveType = '')
#set($moveValueType = '')
#set($keyMoveType = '')
#set($keyValueType = '')
#set($inline = "inline ")
#if(!((($shape.payload && ($shape.payload == $member.key && !$member.value.shape.structure && !$member.value.shape.list)) || $member.value.streaming) && $shape.request))
#set($memberDocumentation = '')
#if($member.value.documentation)
#set($memberDocumentation ="/**${nl} * ${member.value.documentation}${nl} */")
#end
#if((($shape.payload && ($shape.payload == $member.key && !$member.value.shape.structure && !$member.value.shape.list)) || $member.value.streaming) && $shape.result)
#set($cppType = "Aws::Utils::Stream::ResponseStream")
#set($isStream = true)
#else
#set($cppType = $CppViewHelper.computeCppType($member.value.shape))
#set($isStream = false)
#end
#set($subShape = $member.value.shape)
#if ($shape.request && $member.value.shape.isEventStream())
#set($isEventStreamInput = true)
#else
#set($isEventStreamInput = false)
#end
#if(!$subShape.primitive)
#set($rawCppType = ${cppType})
#set($cppType = "const ${rawCppType}&")
#set($moveType = "${rawCppType}&&")
#end
#set ($required = '')
#if(!$isEventStreamInput && !$member.value.required && $useRequiredField)
#set ($required = "${CppViewHelper.computeVariableHasBeenSetName($member.key)} = true; ")
#end
#set($memberVariableName = $CppViewHelper.computeMemberVariableName($member.key))
#set($memberKeyWithFirstLetterCapitalized = $CppViewHelper.capitalizeFirstChar($member.key))
#set($hasBeenSetBody = " { return ${CppViewHelper.computeVariableHasBeenSetName($member.key)}; }")
#set($witherWithCopy = " { Set${memberKeyWithFirstLetterCapitalized}(value); return *this;}")
#set($witherWithMove = " { Set${memberKeyWithFirstLetterCapitalized}(std::move(value)); return *this;}")
#set($adderWithCopy = " { ${required}${memberVariableName}.push_back(value); return *this; }")
#set($adderWithMove = " { ${required}${memberVariableName}.push_back(std::move(value)); return *this; }")
#if($member.value.shape.getName() == $shape.getName())
#set($getterBody = "{ return ${memberVariableName}[0]; }")
#set($setterWithCopy = " { ${required}${memberVariableName}.resize(1); ${memberVariableName}[0] = value; }")
#set($setterWithMove = " { ${required}${memberVariableName}.resize(1); ${memberVariableName}[0] = std::move(value); }")
#elseif($member.value.shape.isMutuallyReferencedWith($shape))
#set($hasBeenSetBody = ";")
#set($getterBody = ";")
#set($setterWithCopy = ";")
#set($setterWithMove = ";")
#set($witherWithCopy = ";")
#set($witherWithMove = ";")
#set($adderWithCopy = ";")
#set($adderWithMove = ";")
#set($inline = "")
#else
#set($getterBody = "{ return ${memberVariableName}; }")
#set($setterWithCopy = " { ${required}${memberVariableName} = value; }")
#set($setterWithMove = " { ${required}${memberVariableName} = std::move(value); }")
#end
#if($isStream)
$memberDocumentation
${inline}Aws::IOStream& Get${memberKeyWithFirstLetterCapitalized}() { return ${memberVariableName}.GetUnderlyingStream(); }
$memberDocumentation
${inline}void ReplaceBody(Aws::IOStream* body) { ${memberVariableName} = Aws::Utils::Stream::ResponseStream(body); }
#elseif ($isEventStreamInput)
$memberDocumentation
std::shared_ptr<${member.value.shape.name}> Get${memberKeyWithFirstLetterCapitalized}() const ${getterBody}
$memberDocumentation
void Set${memberKeyWithFirstLetterCapitalized}(const std::shared_ptr<${member.value.shape.name}>& value)${setterWithCopy}
$memberDocumentation
${classNameRef} With${memberKeyWithFirstLetterCapitalized}(const std::shared_ptr<${member.value.shape.name}>& value)${witherWithCopy}
#else
#set($override = "")
#if($memberKeyWithFirstLetterCapitalized == "ContentType" && $shape.hasStreamMembers() && $shape.request)
#set($override = " override ")
#end
$memberDocumentation
${inline}${cppType} Get${memberKeyWithFirstLetterCapitalized}() const$override${getterBody}
#end
#if(!$isStream && !$isEventStreamInput)
#if(!$member.value.required && $useRequiredField)
$memberDocumentation
${inline}bool ${memberKeyWithFirstLetterCapitalized}HasBeenSet() const${hasBeenSetBody}
#end
$memberDocumentation
${inline}void Set${memberKeyWithFirstLetterCapitalized}(${cppType} value)${setterWithCopy}
#if(!$subShape.primitive)
$memberDocumentation
${inline}void Set${memberKeyWithFirstLetterCapitalized}(${moveType} value)${setterWithMove}
#end
#if($member.value.shape.string)
$memberDocumentation
${inline}void Set${memberKeyWithFirstLetterCapitalized}(const char* value) { ${required}${memberVariableName}.assign(value); }
#end
$memberDocumentation
${inline}${classNameRef} With${memberKeyWithFirstLetterCapitalized}(${cppType} value)${witherWithCopy}
#if(!$subShape.primitive)
$memberDocumentation
${inline}${classNameRef} With${memberKeyWithFirstLetterCapitalized}(${moveType} value)${witherWithMove}
#end
#if($member.value.shape.string)
$memberDocumentation
${inline}${classNameRef} With${memberKeyWithFirstLetterCapitalized}(const char* value)${witherWithCopy}
#end
#end
#if($member.value.shape.map)##TODO: replace Adder functions with $adderWithCopy for map type.
#set($mapMember = $member.value.shape)
#set($keyType = $CppViewHelper.computeCppType($mapMember.mapKey.shape))
#set($valueType = $CppViewHelper.computeCppType($mapMember.mapValue.shape))
#if(!$mapMember.mapKey.shape.primitive)
#set($rawKeyType = $keyType)
#set($keyType = "const ${rawKeyType}&")
#set($keyMoveType = "${rawKeyType}&&")
#end
#if(!$mapMember.mapValue.shape.primitive)
#set($rawValueType = $valueType)
#set($valueType = "const ${rawValueType}&")
#set($valueMoveType = "${rawValueType}&&")
#end
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyType} key, ${valueType} value) { ${required}${memberVariableName}.emplace(key, value); return *this; }
#if(!$mapMember.mapKey.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyMoveType} key, ${valueType} value) { ${required}${memberVariableName}.emplace(std::move(key), value); return *this; }
#end
#if(!$mapMember.mapValue.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyType} key, ${valueMoveType} value) { ${required}${memberVariableName}.emplace(key, std::move(value)); return *this; }
#end
#if(!$mapMember.mapKey.shape.primitive && !$mapMember.mapValue.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyMoveType} key, ${valueMoveType} value) { ${required}${memberVariableName}.emplace(std::move(key), std::move(value)); return *this; }
#end
#if($mapMember.mapKey.shape.string || $mapMember.mapValue.shape.string)
#if($mapMember.mapKey.shape.string)
#set($keyType = 'const char*')
#if(!$mapMember.mapValue.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyType} key, ${valueMoveType} value) { ${required}${memberVariableName}.emplace(key, std::move(value)); return *this; }
#end
#end
#if($mapMember.mapValue.shape.string)
#set($valueType = 'const char*')
#if(!$mapMember.mapKey.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyMoveType} key, ${valueType} value) { ${required}${memberVariableName}.emplace(std::move(key), value); return *this; }
#end
#end
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${keyType} key, ${valueType} value) { ${required}${memberVariableName}.emplace(key, value); return *this; }
#end
#end
#if($member.value.shape.list)
#set($listMember = $member.value.shape)
#set($valueType = $CppViewHelper.computeCppType($listMember.listMember.shape))
#if(!$listMember.listMember.shape.primitive)
#set($rawValueType = "${valueType}")
#set($valueType = "const ${rawValueType}&")
#set($moveValueType = "${rawValueType}&&")
#end
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${valueType} value)$adderWithCopy
#if(!$listMember.listMember.shape.primitive)
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${moveValueType} value)$adderWithMove
#end
#if($listMember.listMember.shape.string)
#set($valueType = 'const char*')
$memberDocumentation
${inline}${classNameRef} Add${memberKeyWithFirstLetterCapitalized}(${valueType} value) { ${required}${memberVariableName}.push_back(value); return *this; }
#end
#end
#end
#end
#if($shape.members.size() > 0)
private:
#foreach($member in $shape.members.entrySet())
#if ($shape.request && $member.value.shape.isEventStream())
#set($isEventStreamInput = true)
#else
#set($isEventStreamInput = false)
#end
#if((($shape.payload && ($shape.payload == $member.key && !$member.value.shape.structure && !$member.value.shape.list)) || $member.value.streaming) && $shape.result)
Aws::Utils::Stream::ResponseStream $CppViewHelper.computeMemberVariableName($member.key);
#elseif(($shape.payload && ($shape.payload == $member.key && !$member.value.shape.structure && !$member.value.shape.list)) && $shape.request)
#else
#if($member.value.shape.getName() == $shape.getName() || $member.value.shape.isMutuallyReferencedWith($shape))
Aws::Vector<$CppViewHelper.computeCppType($member.value.shape)> $CppViewHelper.computeMemberVariableName($member.key);
#elseif($isEventStreamInput)
std::shared_ptr<$member.value.shape.name> $CppViewHelper.computeMemberVariableName($member.key);
#else
$CppViewHelper.computeCppType($member.value.shape) $CppViewHelper.computeMemberVariableName($member.key);
#end
#if(!$member.value.required && $useRequiredField && !$isEventStreamInput)
bool ${CppViewHelper.computeVariableHasBeenSetName($member.key)};
#end
#end
#end
#if($operation.result.shape.hasEventStreamMembers())
Aws::Utils::Event::EventStreamDecoder m_decoder;
${operation.name}Handler m_handler;
#end
#end

View File

@@ -0,0 +1,52 @@
##All this does is set the initializer list
#set($initializers = "")
#set($initializerCount = 0)
#foreach($entry in $shape.members.entrySet())
#set($memberShape = $entry.value.shape)
#if($memberShape.primitive || $memberShape.enum || $entry.value.idempotencyToken)
#set($initializerCount = $initializerCount + 1)
#end
#set($isStreamingMember = ($shape.payload && ($shape.payload == $entry.key && !$entry.value.shape.structure)))
#if(!$entry.value.required && $useRequiredField && !$isStreamingMember && !$memberShape.isEventStream())
#set($initializerCount = $initializerCount + 1)
#end
#end
#if($initializerCount > 0)
#set($initializers = "${initializers} : ")
#end
#set($index = 1)
#foreach($entry in $shape.members.entrySet())
#set($memberShape = $entry.value.shape)
#if($memberShape.primitive || $memberShape.enum || $entry.value.idempotencyToken)
#if($memberShape.primitive)
#set($initializers = "${initializers}${nl} ${CppViewHelper.computeMemberVariableName($entry.key)}(${CppViewHelper.computeDefaultValue($memberShape)})")
#elseif($memberShape.enum)
#set($initializers = "${initializers}${nl} ${CppViewHelper.computeMemberVariableName($entry.key)}(${memberShape.name}::NOT_SET)")
#elseif($entry.value.idempotencyToken)
#set($initializers = "${initializers}${nl} ${CppViewHelper.computeMemberVariableName($entry.key)}(Aws::Utils::UUID::RandomUUID())")
#end
#if($index < $initializerCount)
#set($initializers = "${initializers},")
#end
#set($index = $index + 1)
#end
#set($isStreamingMember = ($shape.payload && ($shape.payload == $entry.key && !$entry.value.shape.structure)))
#if($useRequiredField && ((!$entry.value.required && $useRequiredField && !$isStreamingMember && !$memberShape.isEventStream()) || $entry.value.idempotencyToken))
#if(!$entry.value.idempotencyToken)
#set($initializers = "${initializers}${nl} ${CppViewHelper.computeVariableHasBeenSetName($entry.key)}(false)")
#else
#set($initializers = "${initializers}${nl} ${CppViewHelper.computeVariableHasBeenSetName($entry.key)}(true)")
#end
#if($index < $initializerCount)
#set($initializers = "${initializers},")
#end
#set($index = $index + 1)
#end
#end
#if($shape.request && $operation.result.shape.hasEventStreamMembers())
#if($initializerCount > 0)
#set($initializers = "${initializers},${nl} m_decoder(Aws::Utils::Event::EventStreamDecoder(&m_handler))")
#else
#set($initializers = " : m_decoder(Aws::Utils::Event::EventStreamDecoder(&m_handler))")
#end
#end

View File

@@ -0,0 +1,34 @@
##All this does is set the move initializer list
#set($moveInitializers = "")
#set($initializerCount = 0)
#foreach($entry in $shape.members.entrySet())
#set($initializerCount = $initializerCount + 1)
#if((!$entry.value.required || $entry.value.idempotencyToken) && $useRequiredField)
#set($initializerCount = $initializerCount + 1)
#end
#end
#if($initializerCount > 0)
#set($moveInitializers = "${moveInitializers} : ")
#end
#set($index = 1)
#foreach($entry in $shape.members.entrySet())
#set($memberShape = $entry.value.shape)
#set($memberVarName = $CppViewHelper.computeMemberVariableName($entry.key))
#if($memberShape.primitive || $memberShape.enum)
#set($moveInitializers = "${moveInitializers}${nl} ${memberVarName}(${container}.${memberVarName})")
#else
#set($moveInitializers = "${moveInitializers}${nl} ${memberVarName}(std::move(${container}.${memberVarName}))")
#end
#if($index < $initializerCount)
#set($moveInitializers = "${moveInitializers},")
#end
#set($index = $index + 1)
#if((!$entry.value.required || $entry.value.idempotencyToken) && $useRequiredField)
#set($varHasBeenSetName = $CppViewHelper.computeVariableHasBeenSetName($entry.key))
#set($moveInitializers = "${moveInitializers}${nl} $varHasBeenSetName(${container}.varHasBeenSetName)")
#if($index < $initializerCount)
#set($moveInitializers = "${moveInitializers},")
#end
#set($index = $index + 1)
#end
#end

View File

@@ -0,0 +1,64 @@
#foreach($member in $shape.members.entrySet())
#if($member.value.shape.isMutuallyReferencedWith($shape))
#set($moveType = '')
#set($moveValueType = '')
#set ($required = '')
#if(!$member.value.required && $useRequiredField)
#set ($required = "${CppViewHelper.computeVariableHasBeenSetName($member.key)} = true; ")
#end
#if(!((($shape.payload && ($shape.payload == $member.key && !$member.value.shape.structure && !$member.value.shape.list)) || $member.value.streaming) && $shape.request))
#set($subShape = $member.value.shape)
#if(!$subShape.primitive)
#set($rawCppType = $CppViewHelper.computeCppType($member.value.shape))
#set($cppType = "const ${rawCppType}&")
#set($moveType = "${rawCppType}&&")
#set($classNameRef = "${typeInfo.className}&")
#end
#set($memberVariableName = $CppViewHelper.computeMemberVariableName($member.key))
#set($memberKeyWithFirstLetterCapitalized = $CppViewHelper.capitalizeFirstChar($member.key))
#if($member.value.shape.isMutuallyReferencedWith($shape))
#set($getterBody = "{ return ${memberVariableName}[0]; }")
#set($setterWithCopy = " { ${required}${memberVariableName}.resize(1); ${memberVariableName}[0] = value; }")
#set($setterWithMove = " { ${required}${memberVariableName}.resize(1); ${memberVariableName}[0] = std::move(value); }")
#set($witherWithCopy = " { Set${memberKeyWithFirstLetterCapitalized}(value); return *this;}")
#set($witherWithMove = " { Set${memberKeyWithFirstLetterCapitalized}(std::move(value)); return *this;}")
#end
${cppType} ${typeInfo.className}::Get${memberKeyWithFirstLetterCapitalized}() const${getterBody}
#if(!$member.value.required && $useRequiredField)
bool ${typeInfo.className}::${memberKeyWithFirstLetterCapitalized}HasBeenSet() const { return ${CppViewHelper.computeVariableHasBeenSetName($member.key)}; }
#end
void ${typeInfo.className}::Set${memberKeyWithFirstLetterCapitalized}(${cppType} value)${setterWithCopy}
#if(!$subShape.primitive)
void ${typeInfo.className}::Set${memberKeyWithFirstLetterCapitalized}(${moveType} value)${setterWithMove}
#end
#if($member.value.shape.string)
void ${typeInfo.className}::Set${memberKeyWithFirstLetterCapitalized}(const char* value) { ${required}${memberVariableName}.assign(value); }
#end
${classNameRef} ${typeInfo.className}::With${memberKeyWithFirstLetterCapitalized}(${cppType} value)${witherWithCopy}
#if(!$subShape.primitive)
${classNameRef} ${typeInfo.className}::With${memberKeyWithFirstLetterCapitalized}(${moveType} value)${witherWithMove}
#end
#if($member.value.shape.string)
${classNameRef} ${typeInfo.className}::With${memberKeyWithFirstLetterCapitalized}(const char* value)${witherWithCopy}
#end
#if($member.value.shape.list)
#set($listMember = $member.value.shape)
#set($valueType = $CppViewHelper.computeCppType($listMember.listMember.shape))
#if(!$listMember.listMember.shape.primitive)
#set($rawValueType = "${valueType}")
#set($valueType = "const ${rawValueType}&")
#set($moveValueType = "${rawValueType}&&")
#end
${classNameRef} ${typeInfo.className}::Add${memberKeyWithFirstLetterCapitalized}(${valueType} value) { ${required}${memberVariableName}.push_back(value); return *this; }
#if(!$listMember.listMember.shape.primitive)
${classNameRef} ${typeInfo.className}::Add${memberKeyWithFirstLetterCapitalized}(${moveValueType} value) { ${required}${memberVariableName}.push_back(std::move(value)); return *this; }
#end
#if($listMember.listMember.shape.string)
#set($valueType = 'const char*')
${classNameRef} ${typeInfo.className}::Add${memberKeyWithFirstLetterCapitalized}(${valueType} value) { ${required}${memberVariableName}.push_back(value); return *this; }
#end
#end
#end
#end
#end

View File

@@ -0,0 +1,20 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#pragma once
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/core/utils/memory/stl/AWSString.h>
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace Model
{
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/EnumHeader.vm")
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,88 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/core/utils/HashingUtils.h>
\#include <aws/core/utils/event/EventStreamHandler.h>
\#include <aws/core/client/AWSError.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Errors.h>
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#set($eventShape = $eventMemberEntry.value.shape)
#if(!$eventShape.members.isEmpty() && !$eventShape.isException())
\#include <aws/${metadata.projectName}/model/${eventShape.name}.h>
#end
#end
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace Model
{
enum class ${operation.name}EventType
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#if(!$eventMemberEntry.value.shape.isException())
${eventMemberEntry.key.toUpperCase()},
#end
#end
UNKNOWN
};
class ${typeInfo.exportValue} ${operation.name}Handler : public Aws::Utils::Event::EventStreamHandler
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#set($eventShape = $eventMemberEntry.value.shape)
#if($eventShape.isException())
## skip exceptions
#else
#if(!${eventShape.members.isEmpty()})
typedef std::function<void(const ${eventShape.name}&)> ${eventShape.name}Callback;
#else
typedef std::function<void()> ${eventShape.name}Callback;
#end
#end
#end
typedef std::function<void(const Aws::Client::AWSError<${metadata.classNamePrefix}Errors>& error)> ErrorCallback;
public:
${operation.name}Handler();
${operation.name}Handler& operator=(const ${operation.name}Handler& handler) = default;
virtual void OnEvent() override;
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#if(!$eventMemberEntry.value.shape.isException())
#set($eventShapeName = $eventMemberEntry.value.shape.name)
inline void Set${eventShapeName}Callback(const ${eventShapeName}Callback& callback) { m_on${eventShapeName} = callback; }
#end
#end
inline void SetOnErrorCallback(const ErrorCallback& callback) { m_onError = callback; }
private:
void HandleEventInMessage();
void HandleErrorInMessage();
void MarshallError(const Aws::String& errorCode, const Aws::String& errorMessage);
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#set($eventShapeName = $eventMemberEntry.value.shape.name)
#if(!$eventMemberEntry.value.shape.isException())
${eventShapeName}Callback m_on${eventShapeName};
#end
#end
ErrorCallback m_onError;
};
namespace ${operation.name}EventMapper
{
${typeInfo.exportValue} ${operation.name}EventType Get${operation.name}EventTypeForName(const Aws::String& name);
${typeInfo.exportValue} Aws::String GetNameFor${operation.name}EventType(${operation.name}EventType value);
} // namespace ${operation.name}EventMapper
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,123 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Request.h>
#if($operation.result.shape.hasEventStreamMembers())
\#include <aws/${metadata.projectName}/model/${operation.name}Handler.h>
\#include <aws/core/utils/event/EventStreamDecoder.h>
#end
#if($operation.request.shape.hasEventStreamMembers())
\#include <memory>
#end
#foreach($header in $typeInfo.headerIncludes)
\#include $header
#end
namespace Aws
{
#if($shape.hasQueryStringMembers())
namespace Http
{
class URI;
} //namespace Http
#end
#if ($rootNamespace != "Aws")
} // namespace Aws
namespace ${rootNamespace}
{
#end
namespace ${serviceNamespace}
{
namespace Model
{
#set($jsonRef = "${typeInfo.jsonType}&")
#set($classNameRef = "${typeInfo.className}&")
/**
#if($shape.documentation)
* $shape.documentation
#end
*/
class ${typeInfo.exportValue} ${typeInfo.className} : public ${typeInfo.baseClass}
{
public:
${typeInfo.className}();
// Service request name is the Operation name which will send this request out,
// each operation should has unique request name, so that we can get operation's name from this request.
// Note: this is not true for response, multiple operations may have the same response name,
// so we can not get operation's name from response.
inline virtual const char* GetServiceRequestName() const override { return "${operationName}"; }
#if($shape.hasEventStreamMembers())
inline virtual bool IsEventStreamRequest() const override { return true; }
#end
#if(!$shape.hasStreamMembers() && !$shape.hasEventStreamMembers())
Aws::String SerializePayload() const override;
#elseif($shape.hasEventStreamMembers())
// SerializePayload will not be invoked.
// This request is sent by encoding its data in event-streams which is sent as IOStream via GetBody()
Aws::String SerializePayload() const override { return {}; }
std::shared_ptr<Aws::IOStream> GetBody() const override;
#end
#if($shape.hasQueryStringMembers())
void AddQueryStringParameters(Aws::Http::URI& uri) const override;
#end
#if($shape.hasHeaderMembers() || $metadata.targetPrefix)
Aws::Http::HeaderValueCollection GetRequestSpecificHeaders() const override;
#end
#if($shape.computeContentMd5)
inline bool ShouldComputeContentMd5() const override { return true; }
#end
#if(!$shape.signBody && $shape.members.size() > 0)
bool SignBody() const override { return false; }
#end
## MediaStore Data is the only service supporting chunked transfer encoding.
#if($shape.hasStreamMembers() && !$shape.signBody && $shape.members.size() > 0 && $metadata.serviceId.equals("MediaStore Data"))
bool IsChunked() const override { return true; }
#end
#if($operation.result.shape.hasEventStreamMembers())
/**
* Underlying Event Stream Decoder.
*/
inline Aws::Utils::Event::EventStreamDecoder& GetEventStreamDecoder() { return m_decoder; }
/**
* Underlying Event Stream Handler which is used to define callback functions.
*/
inline const ${operation.name}Handler& GetEventStreamHandler() const { return m_handler; }
/**
* Underlying Event Stream Handler which is used to define callback functions.
*/
inline void SetEventStreamHandler(const ${operation.name}Handler& value) { m_handler = value; m_decoder.ResetEventStreamHandler(&m_handler); }
/**
* Underlying Event Stream Handler which is used to define callback functions.
*/
inline ${operation.name}Request& WithEventStreamHandler(const ${operation.name}Handler& value) { SetEventStreamHandler(value); return *this; }
#end
#if($shape.supportsPresigning)
protected:
void DumpBodyToUrl(Aws::Http::URI& uri ) const override;
public:
#end
#set($useRequiredField = true)
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassMembersAndInlines.vm")
};
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,14 @@
#foreach($operation in $serviceModel.operations)
#if($operation.result.shape.hasEventStreamMembers())
#set($constText = "")
#else
#set($constText = "const ")
#end
#if($operation.request)
#if(!$operation.request.shape.hasEventStreamMembers())
void ${operation.name}AsyncHelper(${constText}Model::${operation.request.shape.name}& request, const ${operation.name}ResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context) const;
#end
#else
void ${operation.name}AsyncHelper(const ${operation.name}ResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context) const;
#end
#end

View File

@@ -0,0 +1,42 @@
#if($signPayloadsOptional)
#set($signPayloads = ", Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy signPayloads = Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never")
#else
#set($signPayloads = "")
#end
#if($virtualAddressingSupported)
#set($virtualAddressing = ", bool useVirtualAddressing = true")
#else
#set($virtualAddressing = "")
#end
#if(!$USEast1RegionalEndpointArgString)
#set($USEast1RegionalEndpointArgString = "")
#end
/**
* Initializes client to use DefaultCredentialProviderChain, with default http client factory, and optional client config. If client config
* is not specified, it will be initialized to default values.
*/
${className}(const Aws::Client::ClientConfiguration& clientConfiguration = Aws::Client::ClientConfiguration()${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString});
/**
* Initializes client to use SimpleAWSCredentialsProvider, with default http client factory, and optional client config. If client config
* is not specified, it will be initialized to default values.
*/
${className}(const Aws::Auth::AWSCredentials& credentials, const Aws::Client::ClientConfiguration& clientConfiguration = Aws::Client::ClientConfiguration()${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString});
/**
* Initializes client to use specified credentials provider with specified client config. If http client factory is not supplied,
* the default http client factory will be used
*/
${className}(const std::shared_ptr<Aws::Auth::AWSCredentialsProvider>& credentialsProvider,
const Aws::Client::ClientConfiguration& clientConfiguration = Aws::Client::ClientConfiguration()${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString});
#if($metadata.standalone || $metadata.apigateway)
/**
* Initializes client to use specified signer with default http client factory, and optional client config. If client config
* is not specified, it will be initialized to default values.
*/
${className}(const std::shared_ptr<Aws::Auth::AWSAuthSignerProvider>& signerProvider,
const Aws::Client::ClientConfiguration& clientConfiguration = Aws::Client::ClientConfiguration()${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString});
#end
virtual ~${className}();

View File

@@ -0,0 +1,16 @@
#foreach($operation in $serviceModel.operations)
#if($operation.request)
#foreach($entity in $operation.request.shape.members.entrySet())
#if($entity.value.shape.isEventStream())
typedef std::function<void(Model::${entity.value.shape.name}&)> ${operation.name}StreamReadyHandler;
#end
#end
#if($operation.result && $operation.result.shape.hasStreamMembers())
typedef std::function<void(const ${className}*, const Model::${operation.request.shape.name}&, Model::${operation.name}Outcome, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&) > ${operation.name}ResponseReceivedHandler;
#else
typedef std::function<void(const ${className}*, const Model::${operation.request.shape.name}&, const Model::${operation.name}Outcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&) > ${operation.name}ResponseReceivedHandler;
#end
#else
typedef std::function<void(const ${className}*, const Model::${operation.name}Outcome&, const std::shared_ptr<const Aws::Client::AsyncCallerContext>&) > ${operation.name}ResponseReceivedHandler;
#end
#end

View File

@@ -0,0 +1,22 @@
#foreach($operation in $serviceModel.operations)
#if($operation.request)
class ${operation.request.shape.name};
#foreach($entity in $operation.request.shape.members.entrySet())
#if($entity.value.shape.isEventStream())
class ${entity.value.shape.name};
#end
#end
#end
#end
#foreach($operation in $serviceModel.operations)
#if($operation.result && !$operation.result.shape.hasEventStreamMembers())
typedef Aws::Utils::Outcome<${operation.result.shape.name}, ${metadata.classNamePrefix}Error> ${operation.name}Outcome;
#else
typedef Aws::Utils::Outcome<Aws::NoResult, ${metadata.classNamePrefix}Error> ${operation.name}Outcome;
#end
#end
#foreach($operation in $serviceModel.operations)
typedef std::future<${operation.name}Outcome> ${operation.name}OutcomeCallable;
#end

View File

@@ -0,0 +1,11 @@
#set($hasNoResult = false)
#foreach($operation in $serviceModel.operations)
#if($operation.result && !$operation.result.shape.hasEventStreamMembers())
\#include <aws/${metadata.projectName}/model/${operation.result.shape.name}.h>
#else
#set($hasNoResult = true)
#end
#end
#if($hasNoResult)
\#include <aws/core/NoResult.h>
#end

View File

@@ -0,0 +1,70 @@
#set($virtual = "")
#if($serviceModel.enableVirtualOperations)
#set($virtual = "virtual")
#end
#foreach($operation in $serviceModel.operations)
#if($operation.result.shape.hasEventStreamMembers())
#set($constText = "")
#else
#set($constText = "const ")
#end
#if(!$operation.documentation)
#set($operation.documentation = '')
#end
#if($operation.request)
#if($operation.request.shape.hasEventStreamMembers())
/**
* ${operation.documentation}
*
* Queues the request into a thread executor.
* The streamReadyHandler is triggered when the stream is ready to be written to.
* The responseHandler is triggered when the request is finished.
*/
$virtual void ${operation.name}Async(Model::${operation.request.shape.name}& request,
const ${operation.name}StreamReadyHandler& streamReadyHandler,
const ${operation.name}ResponseReceivedHandler& responseHandler,
const std::shared_ptr<const Aws::Client::AsyncCallerContext>& handlerContext = nullptr) const;
#else
/**
* ${operation.documentation}
*/
$virtual Model::${operation.name}Outcome ${operation.name}(${constText}Model::${operation.request.shape.name}& request) const;
/**
* ${operation.documentation}
*
* returns a future to the operation so that it can be executed in parallel to other requests.
*/
$virtual Model::${operation.name}OutcomeCallable ${operation.name}Callable(${constText}Model::${operation.request.shape.name}& request) const;
/**
* ${operation.documentation}
*
* Queues the request into a thread executor and triggers associated callback when operation has finished.
*/
$virtual void ${operation.name}Async(${constText}Model::${operation.request.shape.name}& request, const ${operation.name}ResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const;
#end
#else
/**
* ${operation.documentation}
*/
$virtual Model::${operation.name}Outcome ${operation.name}() const;
/**
* ${operation.documentation}
*
* returns a future to the operation so that it can be executed in parallel to other requests.
*/
$virtual Model::${operation.name}OutcomeCallable ${operation.name}Callable() const;
/**
* ${operation.documentation}
*
* Queues the request into a thread executor and triggers associated callback when operation has finished.
*/
$virtual void ${operation.name}Async(const ${operation.name}ResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const;
#end
#end

View File

@@ -0,0 +1,113 @@
#set($startIndex = 0)
#set($skipFirst = false)
#if($virtualAddressingSupported || $arnEndpointSupported)
#if($operation.virtualAddressAllowed)
ComputeEndpointOutcome computeEndpointOutcome = ComputeEndpointString(request.Get${CppViewHelper.convertToUpperCamel($operation.virtualAddressMemberName)}());
#set($startIndex = 1)
#set($skipFirst = true)
#elseif($operation.arnEndpointAllowed)
ComputeEndpointOutcome computeEndpointOutcome = ComputeEndpointString(request.Get${CppViewHelper.convertToUpperCamel($operation.arnEndpointMemberName)}());
#set($startIndex = 1)
#set($skipFirst = true)
#else
ComputeEndpointOutcome computeEndpointOutcome = ComputeEndpointString();
#end
if (!computeEndpointOutcome.IsSuccess())
{
return ${operation.name}Outcome(computeEndpointOutcome.GetError());
}
Aws::Http::URI uri = computeEndpointOutcome.GetResult().first;
#elseif($accountIdInHostnameSupported)
#if($operation.hasAccountIdInHostname)
Aws::String endpointString(ComputeEndpointString(request.GetAccountId()));
if (endpointString.empty())
{
return ${operation.name}Outcome(AWSError<CoreErrors>(CoreErrors::VALIDATION, "", "Account ID provided is not a valid [RFC 1123 2.1] host domain name label.", false/*retryable*/));
}
Aws::Http::URI uri = endpointString;
#else
Aws::Http::URI uri = ComputeEndpointString();
#end
#else
#if($metadata.hasEndpointTrait)
Aws::Http::URI uri = m_scheme + "://" + m_baseUri;
#else
Aws::Http::URI uri = m_uri;
#end
#end
#if($operation.hasEndpointDiscoveryTrait)
if (m_enableEndpointDiscovery)
{
#set($hasId=false)
#foreach($memberEntry in $operation.request.shape.members.entrySet())
#if($memberEntry.value.endpointDiscoveryId)
#set($hasId=true)
#break
#end
#end
#if($hasId)
Aws::String endpointKey = "${operation.name}.";
#foreach($memberEntry in $operation.request.shape.members.entrySet())
#if($memberEntry.value.endpointDiscoveryId)
endpointKey += "${memberEntry.key}:" + request.Get${memberEntry.key}() + ".";
#end
#end
#else
Aws::String endpointKey = "Shared";
#end
Aws::String endpoint;
if (m_endpointsCache.Get(endpointKey, endpoint))
{
AWS_LOGSTREAM_TRACE("${operation.name}", "Making request to cached endpoint: " << endpoint);
uri = endpoint;
}
else
{
AWS_LOGSTREAM_TRACE("${operation.name}", "Endpoint discovery is enabled and there is no usable endpoint in cache. Discovering endpoints from service...");
${metadata.endpointOperationName}Request endpointRequest;
#if($hasId)
endpointRequest.WithOperation("${operation.name}");
#end
#foreach($memberEntry in $operation.request.shape.members.entrySet())
#if($memberEntry.value.endpointDiscoveryId)
endpointRequest.AddIdentifiers("${memberEntry.key}", request.Get${memberEntry.key}());
#end
#end
auto endpointOutcome = ${metadata.endpointOperationName}(endpointRequest);
if (endpointOutcome.IsSuccess() && !endpointOutcome.GetResult().GetEndpoints().empty())
{
const auto& item = endpointOutcome.GetResult().GetEndpoints()[0];
m_endpointsCache.Put(endpointKey, item.GetAddress(), std::chrono::minutes(item.GetCachePeriodInMinutes()));
uri = item.GetAddress();
AWS_LOGSTREAM_TRACE("${operation.name}", "Endpoints cache updated. Address: " << item.GetAddress() << ". Valid in: " << item.GetCachePeriodInMinutes() << " minutes. Making request to newly discovered endpoint.");
}
else
{
#if($operation.requireEndpointDiscovery)
AWS_LOGSTREAM_ERROR("${operation.name}", "Failed to discover endpoints " << endpointOutcome.GetError());
return ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::RESOURCE_NOT_FOUND, "INVALID_ENDPOINT", "Failed to discover endpoint", false));
#else
AWS_LOGSTREAM_ERROR("${operation.name}", "Failed to discover endpoints " << endpointOutcome.GetError() << "\n Endpoint discovery is not required for this operation, falling back to the regional endpoint.");
#end
}
}
}
#end
#if($operation.hasEndpointTrait)
if (m_enableHostPrefixInjection)
{
#foreach($member in $operation.endpoint.getMemberReferences())
if (request.Get${member}().empty())
{
AWS_LOGSTREAM_ERROR("${operation.name}", "HostPrefix required field: ${member}, is empty");
return ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::INVALID_PARAMETER_VALUE, "INVALID_PARAMETER", "Host prefix field is empty", false));
}
#end
uri.SetAuthority(${operation.endpoint.constructHostPrefixString("request")} + uri.GetAuthority());
if (!Aws::Utils::IsValidHost(uri.GetAuthority()))
{
AWS_LOGSTREAM_ERROR("${operation.name}", "Invalid DNS host: " << uri.GetAuthority());
return ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::INVALID_PARAMETER_VALUE, "INVALID_PARAMETER", "Host is invalid", false));
}
}
#end

View File

@@ -0,0 +1,15 @@
#foreach($memberEntry in $operation.request.shape.members.entrySet())
#if($memberEntry.value.validationNeeded && !$memberEntry.value.streaming && !$memberEntry.value.usedForPayload)
#set($memberKeyWithFirstLetterCapitalized = $CppViewHelper.capitalizeFirstChar($memberEntry.key))
if (!request.${memberKeyWithFirstLetterCapitalized}HasBeenSet())
{
AWS_LOGSTREAM_ERROR("${operation.name}", "Required field: ${memberKeyWithFirstLetterCapitalized}, is not set");
#if(!$operation.request.shape.hasEventStreamMembers())
return ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::MISSING_PARAMETER, "MISSING_PARAMETER", "Missing required field [${memberKeyWithFirstLetterCapitalized}]", false));
#else
responseHandler(this, request, ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::MISSING_PARAMETER, "MISSING_PARAMETER", "Missing required field [${memberKeyWithFirstLetterCapitalized}]", false)), handlerContext);
return;
#end
}
#end
#end

View File

@@ -0,0 +1,11 @@
\#include <aws/${metadata.projectName}/${className}.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Endpoint.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ErrorMarshaller.h>
#if($arnEndpointSupported)
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ARN.h>
#end
#foreach($operation in $serviceModel.operations)
#if($operation.request)
\#include <aws/${metadata.projectName}/model/${operation.request.shape.name}.h>
#end
#end

View File

@@ -0,0 +1,194 @@
#if($signPayloadsOptional)
#set($signPayloads = ", Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy signPayloads")
#set($signPayloadsParam = ", signPayloads")
#else
#set($signPayloads = "")
#set($signPayloadsParam = "")
#end
#if($metadata.signatureVersion.equals("s3") || $metadata.signatureVersion.equals("s3v4"))
#if(!$signPayloadsOptional)
#set($signPayloadsParam = ", Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::RequestDependent")
#end
#set($doubleEncodeValue = ", false")
#else
#set($doubleEncodeValue = "")
#end
#if($virtualAddressingSupported)
#set($virtualAddressing = ", bool useVirtualAddressing")
#set($virtualAddressingInit = ", m_useVirtualAddressing(useVirtualAddressing)")
#else
#set($virtualAddressing = "")
#set($virtualAddressingInit = "")
#end
#if(!$USEast1RegionalEndpointArgString)
#set($USEast1RegionalEndpointArgString = "")
#end
#if(!$USEast1RegionalEndpointInitString)
#set($USEast1RegionalEndpointInitString = "")
#end
#if(!$ForRegionExtraArgsString)
#set($ForRegionExtraArgsString = "")
#end
#if($hasEventStreamInputOperation)
${className}::${className}(const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG),
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
${className}::${className}(const AWSCredentials& credentials, const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials),
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
${className}::${className}(const std::shared_ptr<AWSCredentialsProvider>& credentialsProvider,
const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<Aws::Auth::DefaultAuthSignerProvider>(ALLOCATION_TAG, credentialsProvider,
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
#else
${className}::${className}(const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, Aws::MakeShared<DefaultAWSCredentialsProviderChain>(ALLOCATION_TAG),
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
${className}::${className}(const AWSCredentials& credentials, const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, Aws::MakeShared<SimpleAWSCredentialsProvider>(ALLOCATION_TAG, credentials),
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
${className}::${className}(const std::shared_ptr<AWSCredentialsProvider>& credentialsProvider,
const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}${USEast1RegionalEndpointArgString}) :
BASECLASS(clientConfiguration,
Aws::MakeShared<AWSAuthV4Signer>(ALLOCATION_TAG, credentialsProvider,
SERVICE_NAME, Aws::Region::ComputeSignerRegion(clientConfiguration.region)${signPayloadsParam}${doubleEncodeValue}),
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}${USEast1RegionalEndpointInitString}
{
init(clientConfiguration);
}
#end
#if($metadata.standalone || $metadata.apigateway)
${className}::${className}(const std::shared_ptr<Aws::Auth::AWSAuthSignerProvider>& signerProvider,
const Client::ClientConfiguration& clientConfiguration${signPayloads}${virtualAddressing}) :
BASECLASS(clientConfiguration, signerProvider,
Aws::MakeShared<${metadata.classNamePrefix}ErrorMarshaller>(ALLOCATION_TAG)),
m_executor(clientConfiguration.executor)${virtualAddressingInit}
{
init(clientConfiguration);
}
#end
${className}::~${className}()
{
}
void ${className}::init(const ClientConfiguration& config)
{
SetServiceClientName("${metadata.serviceId}");
#if($AdditionalServiceSpecificConfigLoadString)
${AdditionalServiceSpecificConfigLoadString}
#end
m_configScheme = SchemeMapper::ToString(config.scheme);
#if($virtualAddressingSupported || $arnEndpointSupported || $accountIdInHostnameSupported || $metadata.hasEndpointTrait)
m_scheme = m_configScheme;
#if($arnEndpointSupported)
m_useDualStack = config.useDualStack;
#end
if (config.endpointOverride.empty())
{
#if($arnEndpointSupported)
m_useCustomEndpoint = false;
#end
m_baseUri = ${metadata.classNamePrefix}Endpoint::ForRegion(config.region, config.useDualStack${ForRegionExtraArgsString});
}
else
{
#if($arnEndpointSupported)
m_useCustomEndpoint = true;
#end
OverrideEndpoint(config.endpointOverride);
}
#else
if (config.endpointOverride.empty())
{
m_uri = m_configScheme + "://" + ${metadata.classNamePrefix}Endpoint::ForRegion(config.region, config.useDualStack);
}
else
{
OverrideEndpoint(config.endpointOverride);
}
#end
#if($metadata.hasEndpointTrait)
m_enableHostPrefixInjection = config.enableHostPrefixInjection;
#end
#if($metadata.hasEndpointDiscoveryTrait)
if (!config.endpointOverride.empty())
{
m_enableEndpointDiscovery = false;
}
else
{
m_enableEndpointDiscovery = config.enableEndpointDiscovery;
}
#end
}
void ${className}::OverrideEndpoint(const Aws::String& endpoint)
{
#if($virtualAddressingSupported || $arnEndpointSupported || $accountIdInHostnameSupported || $metadata.hasEndpointTrait)
if (endpoint.compare(0, 7, "http://") == 0)
{
m_scheme = "http";
m_baseUri = endpoint.substr(7);
}
else if (endpoint.compare(0, 8, "https://") == 0)
{
m_scheme = "https";
m_baseUri = endpoint.substr(8);
}
else
{
m_scheme = m_configScheme;
m_baseUri = endpoint;
}
#else
if (endpoint.compare(0, 7, "http://") == 0 || endpoint.compare(0, 8, "https://") == 0)
{
m_uri = endpoint;
}
else
{
m_uri = m_configScheme + "://" + endpoint;
}
#end
#if($metadata.hasEndpointDiscoveryTrait)
m_enableEndpointDiscovery = false;
#end
}

View File

@@ -0,0 +1,22 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/core/client/AWSError.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ErrorMarshaller.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Errors.h>
using namespace Aws::Client;
using namespace ${rootNamespace}::${serviceNamespace};
AWSError<CoreErrors> ${metadata.classNamePrefix}ErrorMarshaller::FindErrorByName(const char* errorName) const
{
AWSError<CoreErrors> error = ${metadata.classNamePrefix}ErrorMapper::GetErrorForName(errorName);
if(error.GetErrorType() != CoreErrors::UNKNOWN)
{
return error;
}
return AWSErrorMarshaller::FindErrorByName(errorName);
}

View File

@@ -0,0 +1,124 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
#set($payloadType = ${CppViewHelper.computeServicePayloadType($metadata.protocol)})
#set($nonCoreServiceErrors = $serviceModel.getNonCoreServiceErrors())
\#include <aws/core/client/AWSError.h>
\#include <aws/core/utils/HashingUtils.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}Errors.h>
#if($nonCoreServiceErrors.size() == 0)
\#include <aws/core/utils/UnreferencedParam.h>
#end
#foreach($error in $serviceModel.serviceErrors)
#if($error.isModeled())
\#include <aws/${metadata.projectName}/model/${error.name}.h>
#set($hasModeledErrors = true)
#end
#end
using namespace Aws::Client;
using namespace Aws::Utils;
using namespace ${rootNamespace}::${serviceNamespace};
#if($hasModeledErrors)
using namespace ${rootNamespace}::${serviceNamespace}::Model;
#end
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
#foreach($error in $serviceModel.serviceErrors)
#if($error.isModeled())
#if($error.isCoreError())
#set($constName = ${CppViewHelper.computeCoreErrorConstName($error.name)})
#else
#set($constName = ${ErrorFormatter.formatErrorConstName($error.name)})
#end
template<> ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${error.name} ${metadata.classNamePrefix}Error::GetModeledError()
{
assert(this->GetErrorType() == ${metadata.classNamePrefix}Errors::$constName);
#if($payloadType.equals("xml"))
return ${error.name}(this->GetXmlPayload().GetRootElement());
#elseif($$payloadType.equals("json"))
return ${error.name}(this->GetJsonPayload().View());
#end
}
#end
#end
namespace ${metadata.classNamePrefix}ErrorMapper
{
#foreach($error in $nonCoreServiceErrors)
#set($constName = ${ErrorFormatter.formatErrorConstName($error.name)})
static const int ${constName}_HASH = HashingUtils::HashString("${error.text}");
#end
#if ($nonCoreServiceErrors.size() > 121)
/*
The if-else chains in this file are converted into a jump table by the compiler,
which allows constant time lookup. The chain has been broken into helper functions
because MSVC has a maximum of 122 chained if-else blocks.
*/
#set ($errorCounter = 0)
#foreach($error in $nonCoreServiceErrors)
#if ($errorCounter % 122 == 0)
#set($elseText = "")
#set ($helperIndex = $errorCounter / 122)
static bool GetErrorForNameHelper${helperIndex}(int hashCode, AWSError<CoreErrors>& error)
{
#end
#set($constName = ${ErrorFormatter.formatErrorConstName($error.name)})
${elseText}if (hashCode == ${constName}_HASH)
{
error = AWSError<CoreErrors>(static_cast<CoreErrors>(${metadata.classNamePrefix}Errors::$constName), ${error.retryable});
return true;
}
#set($elseText = "else ")
#set ($errorCounter = $errorCounter + 1)
#if ($errorCounter % 122 == 0 || $errorCounter == $nonCoreServiceErrors.size())
return false;
}
#end
#end
#end
#set($elseText = "")
AWSError<CoreErrors> GetErrorForName(const char* errorName)
{
#if($nonCoreServiceErrors.size() > 0 && $nonCoreServiceErrors.size() < 122)
int hashCode = HashingUtils::HashString(errorName);
#foreach($error in $nonCoreServiceErrors)
#set($constName = ${ErrorFormatter.formatErrorConstName($error.name)})
${elseText}if (hashCode == ${constName}_HASH)
{
return AWSError<CoreErrors>(static_cast<CoreErrors>(${metadata.classNamePrefix}Errors::$constName), ${error.retryable});
}
#set($elseText = "else ")
#end
#elseif ($nonCoreServiceErrors.size() > 121)
#set($elseText = "")
int hashCode = HashingUtils::HashString(errorName);
AWSError<CoreErrors> error;
#set($maxHelperIndex = $nonCoreServiceErrors.size() / 122)
#foreach($helperIndex in [0..$maxHelperIndex])
${elseText}if (GetErrorForNameHelper${helperIndex}(hashCode, error))
{
return error;
}
#set($elseText = "else ")
#end
#else
AWS_UNREFERENCED_PARAM(errorName);
#end
return AWSError<CoreErrors>(CoreErrors::UNKNOWN, false);
}
} // namespace ${metadata.classNamePrefix}ErrorMapper
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,29 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#pragma once
#ifdef _MSC_VER
//disable windows complaining about max template size.
#pragma warning (disable : 4503)
#endif // _MSC_VER
#set($api = $CppViewHelper.computeExportValue($metadata.classNamePrefix))
#set( $define = '#define' )
\#if defined (USE_WINDOWS_DLL_SEMANTICS) || defined (_WIN32)
#ifdef _MSC_VER
#pragma warning(disable : 4251)
#endif // _MSC_VER
#ifdef USE_IMPORT_EXPORT
#ifdef AWS_${metadata.classNamePrefix.toUpperCase()}_EXPORTS
$define ${api} __declspec(dllexport)
\#else
$define ${api} __declspec(dllimport)
#endif /* AWS_${metadata.classNamePrefix.toUpperCase()}_EXPORTS */
\#else
$define ${api}
#endif // USE_IMPORT_EXPORT
\#else // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)
$define ${api}
#endif // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)

View File

@@ -0,0 +1,66 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/${metadata.projectName}/model/${typeInfo.className}.h>
\#include <aws/core/AmazonWebServiceResult.h>
#if($shape.hasQueryStringMembers())
\#include <aws/core/http/URI.h>
#end
#foreach($header in $typeInfo.sourceIncludes)
\#include $header
#end
\#include <utility>
using namespace ${rootNamespace}::${serviceNamespace}::Model;
using namespace Aws::Utils::Stream;
using namespace Aws::Utils;
#if($shape.hasQueryStringMembers())
using namespace Aws::Http;
#end
using namespace Aws;
#set($useRequiredField = true)
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassMembersGenerateInitializers.vm")
${typeInfo.className}::${typeInfo.className}()$initializers
{
}
#if($shape.hasEventStreamMembers())
#foreach($member in $shape.members.entrySet())
#if($shape.request && $member.value.shape.isEventStream())
std::shared_ptr<Aws::IOStream> ${typeInfo.className}::GetBody() const
{
return $CppViewHelper.computeMemberVariableName($member.key);
}
#end
#end
#end
#if($shape.hasQueryStringMembers())
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/AddQueryStringParametersToRequest.vm")
#end
#if($shape.hasHeaderMembers() || $metadata.targetPrefix)
Aws::Http::HeaderValueCollection ${typeInfo.className}::GetRequestSpecificHeaders() const
{
Aws::Http::HeaderValueCollection headers;
#if($metadata.targetPrefix)
headers.insert(Aws::Http::HeaderValuePair("X-Amz-Target", "${metadata.targetPrefix}.${CppViewHelper.computeOperationNameFromInputOutputShape($shape.name)}"));
#end
#if($metadata.additionalHeaders)
#foreach($headerEntry in $metadata.additionalHeaders.entrySet())
headers.insert(Aws::Http::HeaderValuePair("${headerEntry.key}", "${headerEntry.value}"));
#end
#end
#foreach($headerEntry in $requestSpecificHeaders.entrySet())
headers.emplace(${headerEntry.key}, ${headerEntry.value});
#end
#set($useRequiredField = true)
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassHeaderMembersSource.vm")
return headers;
}
#end

View File

@@ -0,0 +1,56 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/$metadata.projectName/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/core/utils/stream/ResponseStream.h>
#foreach($header in $typeInfo.headerIncludes)
\#include $header
#end
namespace Aws
{
template<typename RESULT_TYPE>
class AmazonWebServiceResult;
#if ($rootNamespace != "Aws")
} // namespace Aws
namespace ${rootNamespace}
{
#end
namespace ${serviceNamespace}
{
namespace Model
{
#set($classNameRef = "${typeInfo.className}&")
#if($shape.documentation)
/**
* $shape.documentation
*/
#end
class $typeInfo.exportValue $typeInfo.className
{
public:
${typeInfo.className}();
//We have to define these because Microsoft doesn't auto generate them
${typeInfo.className}(${typeInfo.className}&&);
${classNameRef} operator=(${typeInfo.className}&&);
//we delete these because Microsoft doesn't handle move generation correctly
//and we therefore don't trust them to get it right here either.
${typeInfo.className}(const ${typeInfo.className}&) = delete;
${classNameRef} operator=(const ${typeInfo.className}&) = delete;
${typeInfo.className}(Aws::AmazonWebServiceResult<Aws::Utils::Stream::ResponseStream>&& result);
${classNameRef} operator=(Aws::AmazonWebServiceResult<Aws::Utils::Stream::ResponseStream>&& result);
#set($useRequiredField = false)
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassMembersAndInlines.vm")
};
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,109 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/${metadata.projectName}/model/${typeInfo.className}.h>
\#include <aws/core/AmazonWebServiceResult.h>
\#include <aws/core/utils/StringUtils.h>
#foreach($header in $typeInfo.sourceIncludes)
\#include $header
#end
\#include <utility>
using namespace ${rootNamespace}::${serviceNamespace}::Model;
using namespace Aws::Utils::Stream;
using namespace Aws::Utils;
using namespace Aws;
#set($useRequiredField = false)
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassMembersGenerateInitializers.vm")
${typeInfo.className}::${typeInfo.className}()$initializers
{
}
#set($useRequiredField = false)
#set($container = "toMove")
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/ModelClassMembersGenerateMoveInitializers.vm")
${typeInfo.className}::${typeInfo.className}(${typeInfo.className}&& toMove)$moveInitializers
{
}
${typeInfo.className}& ${typeInfo.className}::operator=(${typeInfo.className}&& toMove)
{
if(this == &toMove)
{
return *this;
}
#foreach($memberEntry in $shape.members.entrySet())
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberEntry.key))
#if($memberEntry.value.shape.primitive || $memberEntry.value.shape.enum)
${memberVarName} = toMove.${memberVarName};
#else
${memberVarName} = std::move(toMove.${memberVarName});
#end
#end
return *this;
}
${typeInfo.className}::${typeInfo.className}(Aws::AmazonWebServiceResult<ResponseStream>&& result)$initializers
{
*this = std::move(result);
}
${typeInfo.className}& ${typeInfo.className}::operator =(Aws::AmazonWebServiceResult<ResponseStream>&& result)
{
${CppViewHelper.computeMemberVariableName($shape.payload)} = result.TakeOwnershipOfPayload();
#if($shape.hasHeaderMembers())
const auto& headers = result.GetHeaderValueCollection();
#foreach($memberEntry in $shape.members.entrySet())
#set($varName = $CppViewHelper.computeVariableName($memberEntry.key))
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberEntry.key))
#if($memberEntry.value.usedForHeader)
#if($memberEntry.value.shape.map)
std::size_t prefixSize = sizeof("${memberEntry.value.locationName}") - 1; //subtract the NULL terminator out
for(const auto& item : headers)
{
std::size_t foundPrefix = item.first.find("${memberEntry.value.locationName}");
if(foundPrefix != std::string::npos)
{
${memberVarName}[item.first.substr(prefixSize)] = item.second;
}
}
#else
const auto& ${varName}Iter = headers.find("${memberEntry.value.locationName}");
if(${varName}Iter != headers.end())
{
#if($memberEntry.value.shape.string)
${memberVarName} = ${varName}Iter->second;
#elseif($memberEntry.value.shape.enum)
${memberVarName} = ${memberEntry.value.shape.name}Mapper::Get${memberEntry.value.shape.name}ForName(${varName}Iter->second);
#elseif($memberEntry.value.shape.timeStamp)
${memberVarName} = DateTime(${varName}Iter->second, DateFormat::RFC822);
#elseif($memberEntry.value.shape.blob)
${memberVarName} = HashingUtils::Base64Decode(StringUtils::Trim(${varName}Iter->second.c_str()));
#elseif($memberEntry.value.shape.primitive)
${memberVarName} = ${CppViewHelper.computeXmlConversionMethodName($memberEntry.value.shape)}(${varName}Iter->second.c_str());
#end
}
#end
#end
#end
#end
#if($shape.hasStatusCodeMembers())
#foreach($memberEntry in $shape.members.entrySet())
#if($memberEntry.value.usedForHttpStatusCode)
${CppViewHelper.computeMemberVariableName($memberEntry.key)} = static_cast<int>(result.GetResponseCode());
#end
#end
#end
return *this;
}

View File

@@ -0,0 +1,170 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
\#include <aws/dynamodb/DynamoDB_EXPORTS.h>
\#include <aws/core/utils/memory/stl/AWSString.h>
\#include <aws/core/utils/memory/stl/AWSVector.h>
\#include <aws/core/utils/Array.h>
\#include <aws/core/utils/json/JsonSerializer.h>
namespace Aws
{
namespace DynamoDB
{
namespace Model
{
class AttributeValueValue;
enum class ValueType {STRING, NUMBER, BYTEBUFFER, STRING_SET, NUMBER_SET, BYTEBUFFER_SET, ATTRIBUTE_MAP, ATTRIBUTE_LIST, BOOL, NULLVALUE};
/// http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html
class AWS_DYNAMODB_API AttributeValue
{
public:
AttributeValue() {};
explicit AttributeValue(const Aws::String& s) { SetS(s); }
explicit AttributeValue(const Aws::Vector<Aws::String>& ss) { SetSS(ss); }
AttributeValue(Aws::Utils::Json::JsonView jsonValue) { *this = jsonValue; }
/// returns the String value if the value is specialized to this type, otherwise an empty String
const Aws::String GetS() const;
/// if already specialized to a String, sets the value to this String
/// if uninitialized, specializes the type to a String with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetS(const Aws::String& s);
/// if uninitialized, specializes the type to a String with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetS(const char* n) { return SetS(Aws::String(n)); }
/// returns the Number value if the value is specialized to this type, otherwise an empty String
const Aws::String GetN() const;
/// if already specialized to a Number, sets the value to this Number
/// if uninitialized, specializes the type to a Number with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetN(const Aws::String& n);
/// if already specialized to a Number, sets the value to this Number
/// if uninitialized, specializes the type to a Number with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetN(const char* n) { return SetN(Aws::String(n)); }
/// if already specialized to a Number, sets the value to this Number
/// if uninitialized, specializes the type to a Number with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetN(const int nItem) { return SetN(Aws::String(std::to_string(nItem).c_str())); }
/// if already specialized to a Number, sets the value to this Number
/// if uninitialized, specializes the type to a Number with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetN(const float nItem) { return SetN(Aws::String(std::to_string(nItem).c_str())); }
/// if already specialized to a Number, sets the value to this Number
/// if uninitialized, specializes the type to a Number with specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetN(const double nItem) { return SetN(Aws::String(std::to_string(nItem).c_str())); }
/// returns the ByteBuffer if the value is specialized to this type, otherwise an empty Buffer
const Aws::Utils::ByteBuffer GetB() const;
/// if already specialized to a ByteBuffer, sets the value to this value
/// if uninitialized, specializes the type to a ByteBuffer with the specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetB(const Aws::Utils::ByteBuffer& b);
/// returns the String Vector if the value is specialized to this type, otherwise an empty Vector
const Aws::Vector<Aws::String> GetSS() const;
/// if already specialized to a String Set, sets to these values
/// if uninitialized, specializes the type to a String Set with specified values
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetSS(const Aws::Vector<Aws::String>& ss);
/// if the value is already specialized to a String Set then this value is appended
/// if uninitialized, specializes the type to a String Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddSItem(const Aws::String& sItem);
/// if the value is already specialized to a String Set then this value is appended
/// if uninitialized, specializes the type to a String Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddSItem(const char* sItem) { return AddSItem(Aws::String(sItem)); }
/// returns the Number Vector if the value is specialized to this type, otherwise an empty Vector
const Aws::Vector<Aws::String> GetNS() const;
/// if already specialized to a Number Set, sets to these values
/// if uninitialized, specializes the type to a Number Set with specified values
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetNS(const Aws::Vector<Aws::String>& ns);
/// if the value is already specialized to a Number Set then this value is appended
/// if uninitialized, specializes the type to a Number Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddNItem(const Aws::String& nItem);
/// if the value is already specialized to a Number Set then this value is appended
/// if uninitialized, specializes the type to a Number Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddNItem(const char* nItem) { return AddNItem(Aws::String(nItem)); }
/// returns the ByteBuffer Vector if the value is specialized to this type, otherwise an empty Vector
const Aws::Vector<Aws::Utils::ByteBuffer> GetBS() const;
/// if already specialized to a ByteBuffer Set, sets to these values
/// if uninitialized, specializes the type to a ByteBuffer Set with specified values
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetBS(const Aws::Vector<Aws::Utils::ByteBuffer>& bs);
/// if the value is already specialized to a ByteBuffer Set then this value is appended
/// if uninitialized, specializes the type to a ByteBuffer Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddBItem(const Aws::Utils::ByteBuffer& bItem);
/// if the value is already specialized to a ByteBuffer Set then this value is appended
/// if uninitialized, specializes the type to a ByteBuffer Set with this initial value
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddBItem(const unsigned char* bItem, size_t size);
/// returns the Attribute Map if the value is specialized to this type, otherwise an empty Map
const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> GetM() const;
/// if already specialized to an Attribute Map, sets to these values
/// if uninitialized, specializes the type to an Attribute Map with specified values
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetM(const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>>& map);
/// if the value is already specialized to a Map then this value is inserted
/// if uninitialized, specializes the type to a Map with these initial values
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddMEntry(const Aws::String& key, const std::shared_ptr<AttributeValue>& value);
/// if the value is already specialized to a Map then this value is inserted
/// if uninitialized, specializes the type to a Map with these initial values
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddMEntry(const char* key, const std::shared_ptr<AttributeValue>& value) { return AddMEntry(Aws::String(key), value); }
/// returns the Attribute List if the value is specialized to this type, otherwise an empty Vector
const Aws::Vector<std::shared_ptr<AttributeValue>> GetL() const;
/// if already specialized to an Attribute List, sets to these values
/// if uninitialized, specializes the type to an Attribute List with specified values
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetL(const Aws::Vector<std::shared_ptr<AttributeValue>>& list);
/// if the value is already specialized to a List then this value is appended
/// if uninitialized, specializes the type to a List with these initial values
/// if already specialized to another type then the behavior is undefined
AttributeValue& AddLItem(const std::shared_ptr<AttributeValue>& listItem);
/// returns the boolean if the value is specialized to this type, otherwise false
bool GetBool() const;
/// if already specialized to a boolean, sets to this value
/// if uninitialized, specializes the type to a boolean with the specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetBool(bool value);
/// returns Null-Set-Value if the value is specialized to this type, otherwise false
bool GetNull() const;
/// if already specialized to a Null, sets to this value
/// if uninitialized, specializes the type to Null with the specified value
/// if already specialized to another type then the behavior is undefined
AttributeValue& SetNull(bool value);
AttributeValue& operator = (Aws::Utils::Json::JsonView);
bool operator == (const AttributeValue& other) const;
inline bool operator != (const AttributeValue& other) const { return !(*this == other); }
Aws::String SerializeAttribute() const;
Aws::Utils::Json::JsonValue Jsonize() const;
ValueType GetType() const;
private:
std::shared_ptr<AttributeValueValue> m_value;
};
} // namespace Model
} // namespace DynamoDB
} // namespace Aws

View File

@@ -0,0 +1,385 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
\#include <aws/dynamodb/model/AttributeValue.h>
\#include <aws/dynamodb/model/AttributeValueValue.h>
\#include <utility>
using namespace Aws::DynamoDB::Model;
using namespace Aws::Utils;
using namespace Aws::Utils::Json;
const Aws::String AttributeValue::GetS() const
{
if (m_value)
{
return m_value->GetS();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetS(const Aws::String& s)
{
m_value = Aws::MakeShared<AttributeValueString>("AttributeValue", s);
return *this;
}
const Aws::String AttributeValue::GetN() const
{
if (m_value)
{
return m_value->GetN();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetN(const Aws::String& n)
{
m_value = Aws::MakeShared<AttributeValueNumeric>("AttributeValue", n);
return *this;
}
const ByteBuffer AttributeValue::GetB() const
{
if (m_value)
{
return m_value->GetB();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetB(const ByteBuffer& b)
{
m_value = Aws::MakeShared<AttributeValueByteBuffer>("AttributeValue", b);
return *this;
}
const Aws::Vector<Aws::String> AttributeValue::GetSS() const
{
if (m_value)
{
return m_value->GetSS();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetSS(const Aws::Vector<Aws::String>& ss)
{
m_value = Aws::MakeShared<AttributeValueStringSet>("AttributeValue", ss);
return *this;
}
AttributeValue& AttributeValue::AddSItem(const Aws::String& sItem)
{
if (!m_value)
{
Aws::Vector<Aws::String> ss;
ss.push_back(sItem);
m_value = Aws::MakeShared<AttributeValueStringSet>("AttributeValue", ss);
}
else
{
m_value->AddSItem(sItem);
}
return *this;
}
const Aws::Vector<Aws::String> AttributeValue::GetNS() const
{
if (m_value)
{
return m_value->GetNS();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetNS(const Aws::Vector<Aws::String>& ns)
{
m_value = Aws::MakeShared<AttributeValueNumberSet>("AttributeValue", ns);
return *this;
}
AttributeValue& AttributeValue::AddNItem(const Aws::String& nItem)
{
if (!m_value)
{
Aws::Vector<Aws::String> ns;
ns.push_back(nItem);
m_value = Aws::MakeShared<AttributeValueNumberSet>("AttributeValue", ns);
}
else
{
m_value->AddNItem(nItem);
}
return *this;
}
const Aws::Vector<ByteBuffer> AttributeValue::GetBS() const
{
if (m_value)
{
return m_value->GetBS();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetBS(const Aws::Vector<ByteBuffer>& bs)
{
m_value = Aws::MakeShared<AttributeValueByteBufferSet>("AttributeValue", bs);
return *this;
}
AttributeValue& AttributeValue::AddBItem(const ByteBuffer& bItem)
{
if (!m_value)
{
Aws::Vector<ByteBuffer> bs;
bs.push_back(bItem);
m_value = Aws::MakeShared<AttributeValueByteBufferSet>("AttributeValue", bs);
}
else
{
m_value->AddBItem(bItem);
}
return *this;
}
AttributeValue& AttributeValue::AddBItem(const unsigned char* bItem, size_t size)
{
return AddBItem(ByteBuffer(bItem, size));
}
const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> AttributeValue::GetM() const
{
if (m_value)
{
return m_value->GetM();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetM(const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>>& map)
{
m_value = Aws::MakeShared<AttributeValueMap>("AttributeValue", map);
return *this;
}
AttributeValue& AttributeValue::AddMEntry(const Aws::String& key, const std::shared_ptr<AttributeValue>& value)
{
if (!m_value)
{
Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> map;
auto kvp = std::pair<Aws::String, const std::shared_ptr<AttributeValue>>(key, value);
map.insert(map.begin(), kvp);
m_value = Aws::MakeShared<AttributeValueMap>("AttributeValue", map);
}
else
{
m_value->AddMEntry(key, value);
}
return *this;
}
const Aws::Vector<std::shared_ptr<AttributeValue>> AttributeValue::GetL() const
{
if (m_value)
{
return m_value->GetL();
}
else
{
return {};
}
}
AttributeValue& AttributeValue::SetL(const Aws::Vector<std::shared_ptr<AttributeValue>>& list)
{
m_value = Aws::MakeShared<AttributeValueList>("AttributeValue", list);
return *this;
}
AttributeValue& AttributeValue::AddLItem(const std::shared_ptr<AttributeValue>& listItem)
{
if (!m_value)
{
Aws::Vector<std::shared_ptr<AttributeValue>> list;
list.push_back(listItem);
m_value = Aws::MakeShared<AttributeValueList>("AttributeValue", list);
}
else
{
m_value->AddLItem(listItem);
}
return *this;
}
bool AttributeValue::GetBool() const
{
if (m_value)
{
return m_value->GetBool();
}
else
{
return false;
}
}
AttributeValue& AttributeValue::SetBool(bool value)
{
m_value = Aws::MakeShared<AttributeValueBool>("AttributeValue", value);
return *this;
}
bool AttributeValue::GetNull() const
{
if (m_value)
{
return m_value->GetNull();
}
else
{
return false;
}
}
AttributeValue& AttributeValue::SetNull(bool value)
{
m_value = Aws::MakeShared<AttributeValueNull>("AttributeValue", value);
return *this;
}
AttributeValue& AttributeValue::operator =(JsonView jsonValue)
{
if (jsonValue.ValueExists("S"))
{
m_value = Aws::MakeShared<AttributeValueString>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("N"))
{
m_value = Aws::MakeShared<AttributeValueNumeric>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("B"))
{
m_value = Aws::MakeShared<AttributeValueByteBuffer>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("SS"))
{
m_value = Aws::MakeShared<AttributeValueStringSet>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("NS"))
{
m_value = Aws::MakeShared<AttributeValueNumberSet>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("BS"))
{
m_value = Aws::MakeShared<AttributeValueByteBufferSet>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("M"))
{
m_value = Aws::MakeShared<AttributeValueMap>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("L"))
{
m_value = Aws::MakeShared<AttributeValueList>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("BOOL"))
{
m_value = Aws::MakeShared<AttributeValueBool>("AttributeValue", jsonValue);
return *this;
}
if (jsonValue.ValueExists("NULL"))
{
m_value = Aws::MakeShared<AttributeValueNull>("AttributeValue", jsonValue);
return *this;
}
return *this;
}
bool AttributeValue::operator ==(const AttributeValue& other) const
{
if (this == &other)
return true;
if (m_value)
{
if (other.m_value)
{
return *m_value == *other.m_value;
}
else
{
return m_value->IsDefault();
}
}
else if (other.m_value)
{
return other.m_value->IsDefault();
}
return true;
}
JsonValue AttributeValue::Jsonize() const
{
if (m_value)
{
return m_value->Jsonize();
}
else
{
return JsonValue();
}
}
Aws::String AttributeValue::SerializeAttribute() const
{
JsonValue value = Jsonize();
return value.View().WriteReadable();
}
Aws::DynamoDB::Model::ValueType AttributeValue::GetType() const
{
return m_value->GetType();
}

View File

@@ -0,0 +1,232 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
\#include <aws/dynamodb/DynamoDB_EXPORTS.h>
\#include <aws/dynamodb/model/AttributeValue.h>
\#include <aws/core/utils/memory/stl/AWSString.h>
\#include <aws/core/utils/memory/stl/AWSVector.h>
\#include <aws/core/utils/json/JsonSerializer.h>
\#include <cassert>
namespace Aws
{
namespace DynamoDB
{
namespace Model
{
class AttributeValue;
class AttributeValueValue
{
public:
virtual const Aws::String GetS() const { return {}; }
virtual const Aws::String GetN() const { return {}; }
virtual const Aws::Utils::ByteBuffer GetB() const { return {}; }
virtual const Aws::Vector<Aws::String> GetSS() const { return {}; }
virtual void AddSItem(const Aws::String& ) { assert(false); }
virtual const Aws::Vector<Aws::String> GetNS() const { return {}; }
virtual void AddNItem(const Aws::String& ) { assert(false); }
virtual const Aws::Vector<Aws::Utils::ByteBuffer> GetBS() const { return {}; }
virtual void AddBItem(const Aws::Utils::ByteBuffer&) { assert(false); }
virtual const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> GetM() const { return {}; }
virtual void AddMEntry(const Aws::String& , const std::shared_ptr<AttributeValue>& ) { assert(false); }
virtual const Aws::Vector<std::shared_ptr<AttributeValue>> GetL() const { return {}; }
virtual void AddLItem(const std::shared_ptr<AttributeValue>& ) { assert(false); }
virtual bool GetBool() const { return false; }
virtual bool GetNull() const { return false; }
virtual bool IsDefault() const = 0;
virtual bool operator == (const AttributeValueValue& other) const = 0;
virtual Aws::Utils::Json::JsonValue Jsonize() const = 0;
virtual ValueType GetType() const = 0;
};
/// String data type
class AttributeValueString final : public AttributeValueValue
{
public:
explicit AttributeValueString(const Aws::String& value) : m_s(value) {}
explicit AttributeValueString(Aws::Utils::Json::JsonView jsonValue) : m_s(jsonValue.GetString("S")) {}
const Aws::String GetS() const override { return m_s; }
bool IsDefault() const override { return m_s.empty(); }
bool operator == (const AttributeValueValue& other) const override { return GetType() == other.GetType() && m_s == other.GetS(); }
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::STRING; }
private:
Aws::String m_s;
};
/// Numeric data type
class AttributeValueNumeric final : public AttributeValueValue
{
public:
explicit AttributeValueNumeric(const Aws::String& value) : m_n(value) {}
explicit AttributeValueNumeric(Aws::Utils::Json::JsonView jsonValue) : m_n(jsonValue.GetString("N")) {}
const Aws::String GetN() const override { return m_n; }
bool IsDefault() const override { return m_n.empty(); }
bool operator == (const AttributeValueValue& other) const override { return GetType() == other.GetType() && m_n == other.GetN(); };
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::NUMBER; }
private:
Aws::String m_n;
};
/// Binary data type
class AttributeValueByteBuffer final : public AttributeValueValue
{
public:
explicit AttributeValueByteBuffer(const Aws::Utils::ByteBuffer& value) : m_b(value) {}
explicit AttributeValueByteBuffer(Aws::Utils::Json::JsonView jsonValue);
const Aws::Utils::ByteBuffer GetB() const override { return m_b; }
bool IsDefault() const override { return m_b.GetLength() == 0; }
bool operator == (const AttributeValueValue& other) const override { return GetType() == other.GetType() && m_b == other.GetB(); }
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::BYTEBUFFER; }
private:
Aws::Utils::ByteBuffer m_b;
};
/// String set data type
class AttributeValueStringSet final : public AttributeValueValue
{
public:
explicit AttributeValueStringSet(const Aws::Vector<Aws::String>& value) : m_sS(value) {}
explicit AttributeValueStringSet(Aws::Utils::Json::JsonView jsonValue);
const Aws::Vector<Aws::String> GetSS() const override { return m_sS; }
void AddSItem(const Aws::String& sItem) override { m_sS.push_back(sItem); }
bool IsDefault() const override { return m_sS.empty(); }
bool operator == (const AttributeValueValue& other) const override;
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::STRING_SET; }
private:
Aws::Vector<Aws::String> m_sS;
};
/// Number set data type
class AttributeValueNumberSet final : public AttributeValueValue
{
public:
explicit AttributeValueNumberSet(const Aws::Vector<Aws::String>& value) : m_nS(value) {}
explicit AttributeValueNumberSet(Aws::Utils::Json::JsonView jsonValue);
const Aws::Vector<Aws::String> GetNS() const override { return m_nS; }
void AddNItem(const Aws::String& nItem) override { m_nS.push_back(nItem); }
bool IsDefault() const override { return m_nS.empty(); }
bool operator == (const AttributeValueValue& other) const override;
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::NUMBER_SET; }
private:
Aws::Vector<Aws::String> m_nS;
};
/// ByteByffer set data type
class AttributeValueByteBufferSet final : public AttributeValueValue
{
public:
explicit AttributeValueByteBufferSet(const Aws::Vector<Aws::Utils::ByteBuffer>& value) : m_bS(value) {}
explicit AttributeValueByteBufferSet(Aws::Utils::Json::JsonView jsonValue);
const Aws::Vector<Aws::Utils::ByteBuffer> GetBS() const override { return m_bS; }
void AddBItem(const Aws::Utils::ByteBuffer& bItem) override { m_bS.push_back(bItem); }
bool IsDefault() const override { return m_bS.empty(); }
bool operator == (const AttributeValueValue& other) const override;
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::BYTEBUFFER_SET; }
private:
Aws::Vector<Aws::Utils::ByteBuffer> m_bS;
};
/// Map Attribute Type
class AttributeValueMap final : public AttributeValueValue
{
public:
explicit AttributeValueMap(const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>>& value) : m_m(value) {}
explicit AttributeValueMap(Aws::Utils::Json::JsonView jsonValue);
const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> GetM() const override{ return m_m; }
void AddMEntry(const Aws::String& key, const std::shared_ptr<AttributeValue>& value) override;
bool IsDefault() const override { return m_m.empty(); }
bool operator == (const AttributeValueValue& other) const override;
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::ATTRIBUTE_MAP; }
private:
Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>> m_m;
};
/// List Attribute Type
class AttributeValueList final : public AttributeValueValue
{
public:
explicit AttributeValueList(const Aws::Vector<std::shared_ptr<AttributeValue>>& value) : m_l(value) {}
explicit AttributeValueList(Aws::Utils::Json::JsonView jsonValue);
const Aws::Vector<std::shared_ptr<AttributeValue>> GetL() const override { return m_l; }
void AddLItem(const std::shared_ptr<AttributeValue>& listItem) override { m_l.push_back(listItem); }
bool IsDefault() const override { return m_l.empty(); }
bool operator == (const AttributeValueValue& other) const override;
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::ATTRIBUTE_LIST; }
private:
Aws::Vector<std::shared_ptr<AttributeValue>> m_l;
};
/// Bool type
class AttributeValueBool final : public AttributeValueValue
{
public:
explicit AttributeValueBool(bool value) : m_bool(value) {}
explicit AttributeValueBool(Aws::Utils::Json::JsonView jsonValue) : m_bool(jsonValue.GetBool("BOOL")) {}
bool GetBool() const override { return m_bool; }
bool IsDefault() const override { return m_bool == false; }
bool operator == (const AttributeValueValue& other) const override { return GetType() == other.GetType() && m_bool == other.GetBool(); }
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::BOOL; }
private:
bool m_bool;
};
/// NULL type
class AttributeValueNull final : public AttributeValueValue
{
public:
explicit AttributeValueNull(bool value) : m_null(value) {}
explicit AttributeValueNull(Aws::Utils::Json::JsonView jsonValue) : m_null(jsonValue.GetBool("NULL")) {}
bool GetNull() const override { return m_null; }
bool IsDefault() const override { return m_null == false; }
bool operator == (const AttributeValueValue& other) const override { return GetType() == other.GetType() && m_null == other.GetNull(); }
Aws::Utils::Json::JsonValue Jsonize() const override;
ValueType GetType() const override { return ValueType::NULLVALUE; }
private:
bool m_null;
};
} // Model
} // DynamoDB
} // Aws

View File

@@ -0,0 +1,330 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
\#include <aws/dynamodb/model/AttributeValueValue.h>
\#include <aws/core/utils/HashingUtils.h>
using namespace Aws::DynamoDB::Model;
using namespace Aws::Utils;
using namespace Aws::Utils::Json;
//
// Strings
//
JsonValue AttributeValueString::Jsonize() const
{
JsonValue value;
value.WithString("S", m_s);
return value;
}
//
// Numerics
//
JsonValue AttributeValueNumeric::Jsonize() const
{
JsonValue value;
if (!m_n.empty())
{
value.WithString("N", m_n);
}
return value;
}
//
// ByteBuffers
//
AttributeValueByteBuffer::AttributeValueByteBuffer(JsonView jsonValue)
{
m_b = HashingUtils::Base64Decode(jsonValue.GetString("B"));
}
JsonValue AttributeValueByteBuffer::Jsonize() const
{
JsonValue value;
value.WithString("B", HashingUtils::Base64Encode(m_b));
return value;
}
//
// String Sets
//
AttributeValueStringSet::AttributeValueStringSet(JsonView jsonValue)
{
Array<JsonView> ss = jsonValue.GetArray("SS");
for (unsigned i = 0; i < ss.GetLength(); ++i)
{
m_sS.push_back(ss[i].AsString());
}
}
bool AttributeValueStringSet::operator == (const AttributeValueValue& other) const
{
const Aws::Vector<Aws::String>& other_sS(other.GetSS());
if (GetType() != other.GetType() || m_sS.size() != other_sS.size())
return false;
for (unsigned i = 0; i < m_sS.size(); ++i)
if (m_sS[i] != other_sS[i])
return false;
return true;
}
JsonValue AttributeValueStringSet::Jsonize() const
{
JsonValue value;
if (m_sS.size() > 0)
{
Array<JsonValue> array(m_sS.size());
for (unsigned i = 0; i < m_sS.size(); ++i)
{
array[i].AsString(m_sS[i]);
}
value.WithArray("SS", std::move(array));
}
return value;
}
//
// Number Sets
//
AttributeValueNumberSet::AttributeValueNumberSet(JsonView jsonValue)
{
const Array<JsonView> ns = jsonValue.GetArray("NS");
for (unsigned i = 0; i < ns.GetLength(); ++i)
{
m_nS.push_back(ns[i].AsString());
}
}
bool AttributeValueNumberSet::operator == (const AttributeValueValue& other) const
{
const Aws::Vector<Aws::String>& other_nS(other.GetNS());
if (GetType() != other.GetType() || m_nS.size() != other_nS.size())
return false;
for (unsigned i = 0; i < m_nS.size(); ++i)
if (m_nS[i] != other_nS[i])
return false;
return true;
}
JsonValue AttributeValueNumberSet::Jsonize() const
{
JsonValue value;
if (m_nS.size() > 0)
{
Array<JsonValue> array(m_nS.size());
for (unsigned i = 0; i < m_nS.size(); ++i)
{
array[i].AsString(m_nS[i]);
}
value.WithArray("NS", std::move(array));
}
return value;
}
//
// ByteBuffer Sets
//
AttributeValueByteBufferSet::AttributeValueByteBufferSet(JsonView jsonValue)
{
const Array<JsonView> bs = jsonValue.GetArray("BS");
for (unsigned i = 0; i < bs.GetLength(); ++i)
{
m_bS.push_back(HashingUtils::Base64Decode(bs[i].AsString()));
}
}
bool AttributeValueByteBufferSet::operator == (const AttributeValueValue& other) const
{
const Aws::Vector<Aws::Utils::ByteBuffer>& other_bS(other.GetBS());
if (GetType() != other.GetType() || m_bS.size() != other_bS.size())
return false;
for (unsigned i = 0; i < m_bS.size(); ++i)
if (m_bS[i] != other_bS[i])
return false;
return true;
}
JsonValue AttributeValueByteBufferSet::Jsonize() const
{
JsonValue value;
if (m_bS.size() > 0)
{
Array<JsonValue> array(m_bS.size());
for (unsigned i = 0; i < m_bS.size(); ++i)
{
array[i].AsString(HashingUtils::Base64Encode(m_bS[i]));
}
value.WithArray("BS", std::move(array));
}
return value;
}
//
// AttributeValue Map
//
AttributeValueMap::AttributeValueMap(JsonView jsonValue)
{
const Aws::Map<Aws::String, JsonView> map = jsonValue.GetObject("M").GetAllObjects();
for (auto& item : map)
{
std::shared_ptr<AttributeValue> attributeValue = Aws::MakeShared<AttributeValue>("AttributeValue");
JsonView itemValue = item.second;
*attributeValue = itemValue;
m_m.emplace(item.first, std::move(attributeValue));
}
}
void AttributeValueMap::AddMEntry(const Aws::String& key, const std::shared_ptr<AttributeValue>& value)
{
m_m.insert(m_m.begin(), std::pair<Aws::String, const std::shared_ptr<AttributeValue>>(key, value));
}
bool AttributeValueMap::operator == (const AttributeValueValue& other) const
{
const Aws::Map<Aws::String, const std::shared_ptr<AttributeValue>>& other_m(other.GetM());
if (GetType() != other.GetType() || m_m.size() != other_m.size())
return false;
if (m_m.size() > 0)
{
for (auto& mapItem : m_m)
{
auto foundItem = other_m.find(mapItem.first);
if (foundItem == other_m.end())
return false;
if (*foundItem->second != *mapItem.second)
return false;
}
}
return true;
}
JsonValue AttributeValueMap::Jsonize() const
{
JsonValue value;
JsonValue mapValue;
for (auto& mapItem : m_m)
{
JsonValue mapEntry = mapItem.second->Jsonize();
mapValue.WithObject(mapItem.first, std::move(mapEntry));
}
value.WithObject("M", std::move(mapValue));
return value;
}
//
// AttributeValue List
//
AttributeValueList::AttributeValueList(JsonView jsonValue)
{
const Array<JsonView> array = jsonValue.GetArray("L");
for (unsigned i = 0; i < array.GetLength(); ++i)
{
std::shared_ptr<AttributeValue> attributeValue = Aws::MakeShared<AttributeValue>("AttributeValue");
JsonView itemValue = array[i];
*attributeValue = itemValue;
m_l.push_back(attributeValue);
}
}
bool AttributeValueList::operator == (const AttributeValueValue& other) const
{
const Aws::Vector<std::shared_ptr<AttributeValue>>& other_l(other.GetL());
if (GetType() != other.GetType() || m_l.size() != other_l.size())
return false;
if (m_l.size() > 0)
{
for (unsigned i = 0; i < m_l.size(); ++i)
{
if (*m_l[i] != *other_l[i])
return false;
}
}
return true;
}
JsonValue AttributeValueList::Jsonize() const
{
JsonValue value;
Array<JsonValue> list(m_l.size());
for (unsigned i = 0; i < m_l.size(); ++i)
{
list[i] = m_l[i]->Jsonize();
}
value.WithArray("L", std::move(list));
return value;
}
//
// Bool type
//
JsonValue AttributeValueBool::Jsonize() const
{
JsonValue value;
value.WithBool("BOOL", m_bool);
return value;
}
//
// Null type
//
JsonValue AttributeValueNull::Jsonize() const
{
JsonValue value;
value.WithBool("NULL", m_null);
return value;
}

View File

@@ -0,0 +1,78 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#pragma once
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/$metadata.projectName/${metadata.classNamePrefix}_EXPORTS.h>
#foreach($header in $typeInfo.headerIncludes)
\#include $header
#end
\#include <aws/core/utils/event/EventStream.h>
#foreach($entry in $shape.members.entrySet())
#if($entry.value.shape.isEvent())
#foreach($eventMemberEntry in $entry.value.shape.members.entrySet())
#if($eventMemberEntry.value.isEventPayload())
#if($eventMemberEntry.value.shape.isStructure())
\#include <aws/core/utils/json/JsonSerializer.h>
#end
#break
#end
#end
#end
#end
namespace Aws
{
#if ($rootNamespace != "Aws")
} // namespace Aws
namespace ${rootNamespace}
{
#end
namespace ${serviceNamespace}
{
namespace Model
{
#set($classNameRef = "${typeInfo.className}&")
#if($shape.documentation)
/**
* $shape.documentation
*/
#end
class $typeInfo.exportValue $typeInfo.className : public Aws::Utils::Event::EventEncoderStream
{
public:
#foreach($entry in $shape.members.entrySet())
#if($entry.value.shape.isEvent())
${typeInfo.className}& Write${entry.value.shape.name}(const ${entry.value.shape.name}& value)
{
Aws::Utils::Event::Message msg;
msg.InsertEventHeader(":message-type", Aws::String("event"));
msg.InsertEventHeader(":event-type", Aws::String("${entry.value.shape.name}"));
#foreach($eventMemberEntry in $entry.value.shape.members.entrySet())
#if($eventMemberEntry.value.isEventPayload())
#if($eventMemberEntry.value.shape.isBlob())
msg.InsertEventHeader(":content-type", Aws::String("application/octet-stream"));
msg.WriteEventPayload(value.Get${eventMemberEntry.key}());
#elseif($eventMemberEntry.value.shape.isString())
msg.InsertEventHeader(":content-type", Aws::String("text/plain"));
msg.WriteEventPayload(value.Get${eventMemberEntry.key}());
#elseif($eventMemberEntry.value.shape.isStructure())
msg.InsertEventHeader(":content-type", Aws::String("application/json"));
msg.WriteEventPayload(value.Jsonize().View().WriteCompact());
#end
#break
#end
#end
WriteEvent(msg);
return *this;
}
#end
#end
};
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,36 @@
#foreach($entry in $shape.members.entrySet())
#set($memberName = $entry.key)
#set($member = $entry.value)
#if($member.usedForPayload)
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberName))
#set($varNameHasBeenSet = $CppViewHelper.computeVariableHasBeenSetName($memberName))
#if(!$member.required && $useRequiredField)
if($varNameHasBeenSet)
{
#end
#if($member.shape.enum)
uri.AddQueryStringParameter("${memberName}", ${member.shape.name}Mapper::GetNameFor${member.shape.name}($memberVarName));
#elseif($member.shape.string)
uri.AddQueryStringParameter("${memberName}", $memberVarName);
#elseif($member.shape.list)
for(auto& item : ${memberVarName})
{
#if($member.shape.listMember.shape.enum)
uri.AddQueryStringParameter("${memberName}", ${member.shape.listMember.shape.name}Mapper::GetNameFor${member.shape.listMember.shape.name}(item));
#else
uri.AddQueryStringParameter("${memberName}", StringUtils::to_string(item));
#end
}
#elseif($member.shape.blob)
uri.AddQueryStringParameter("${memberName}", HashingUtils::Base64Encode($memberVarName)));
#elseif($member.shape.timeStamp)
uri.AddQueryStringParameter("${memberName}", StringUtils::to_string($memberVarName.SecondsWithMSPrecision()));
#else
uri.AddQueryStringParameter("${memberName}", StringUtils::to_string($memberVarName));
#end
#if(!$member.required && $useRequiredField)
}
#end
#end
#end

View File

@@ -0,0 +1,28 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#if($rootNamespace == "Aws")
#set($serviceNamespace = "Client")
#else
#set($serviceNamespace = $metadata.namespace)
#end
#pragma once
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}_EXPORTS.h>
\#include <aws/core/client/AWSErrorMarshaller.h>
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
#set($className = "${metadata.classNamePrefix}ErrorMarshaller")
class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} $className : public Aws::Client::JsonErrorMarshaller
{
public:
Aws::Client::AWSError<Aws::Client::CoreErrors> FindErrorByName(const char* exceptionName) const override;
};
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

View File

@@ -0,0 +1,283 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cfamily/Attribution.vm")
#set($metadata = $serviceModel.metadata)
#set($rootNamespace = $serviceModel.namespace)
#set($serviceNamespace = $metadata.namespace)
\#include <aws/${metadata.projectName}/model/${operation.name}Handler.h>
\#include <aws/${metadata.projectName}/${metadata.classNamePrefix}ErrorMarshaller.h>
\#include <aws/core/client/CoreErrors.h>
\#include <aws/core/utils/event/EventStreamErrors.h>
\#include <aws/core/utils/logging/LogMacros.h>
\#include <aws/core/utils/json/JsonSerializer.h>
using namespace ${rootNamespace}::${serviceNamespace}::Model;
using namespace Aws::Utils::Event;
using namespace Aws::Utils::Json;
AWS_CORE_API extern const char MESSAGE_LOWER_CASE[];
AWS_CORE_API extern const char MESSAGE_CAMEL_CASE[];
namespace ${rootNamespace}
{
namespace ${serviceNamespace}
{
namespace Model
{
using namespace Aws::Client;
static const char ${operation.name.toUpperCase()}_HANDLER_CLASS_TAG[] = "${operation.name}Handler";
${operation.name}Handler::${operation.name}Handler() : EventStreamHandler()
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#set($eventShape = $eventMemberEntry.value.shape)
#if($eventShape.isException())
## skip exceptions
#else
#if(!${eventShape.members.isEmpty()})
m_on${eventShape.name} = [&](const ${eventShape.name}&)
{
AWS_LOGSTREAM_TRACE(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "${eventShape.name} received.");
};
#else
m_on${eventShape.name} = [&]()
{
AWS_LOGSTREAM_TRACE(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "${eventShape.name} received.");
};
#end
#end
#end
m_onError = [&](const AWSError<${metadata.classNamePrefix}Errors>& error)
{
AWS_LOGSTREAM_TRACE(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "${metadata.classNamePrefix} Errors received, " << error);
};
}
void ${operation.name}Handler::OnEvent()
{
using namespace Aws::Utils::Event;
// Handler internal error during event stream decoding.
if (!*this)
{
AWSError<CoreErrors> error = EventStreamErrorsMapper::GetAwsErrorForEventStreamError(GetInternalError());
error.SetMessage(GetEventPayloadAsString());
m_onError(AWSError<${metadata.classNamePrefix}Errors>(error));
return;
}
const auto& headers = GetEventHeaders();
auto messageTypeHeaderIter = headers.find(MESSAGE_TYPE_HEADER);
if (messageTypeHeaderIter == headers.end())
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Header: " << MESSAGE_TYPE_HEADER << " not found in the message.");
return;
}
switch (Message::GetMessageTypeForName(messageTypeHeaderIter->second.GetEventHeaderValueAsString()))
{
case Message::MessageType::EVENT:
HandleEventInMessage();
break;
case Message::MessageType::REQUEST_LEVEL_ERROR:
case Message::MessageType::REQUEST_LEVEL_EXCEPTION:
{
HandleErrorInMessage();
break;
}
default:
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG,
"Unexpected message type: " << messageTypeHeaderIter->second.GetEventHeaderValueAsString());
break;
}
}
void ${operation.name}Handler::HandleEventInMessage()
{
const auto& headers = GetEventHeaders();
auto eventTypeHeaderIter = headers.find(EVENT_TYPE_HEADER);
if (eventTypeHeaderIter == headers.end())
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Header: " << EVENT_TYPE_HEADER << " not found in the message.");
return;
}
switch (${operation.name}EventMapper::Get${operation.name}EventTypeForName(eventTypeHeaderIter->second.GetEventHeaderValueAsString()))
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#set($eventShape = $eventMemberEntry.value.shape)
#if($eventShape.isException())
## skip exceptions
#else
case ${operation.name}EventType::${eventMemberEntry.key.toUpperCase()}:
{
#if($eventShape.members.size() == 1)
#foreach($eventShapeMemberEntry in $eventShape.members.entrySet())
#set($onlyEventMemberKey = $eventShapeMemberEntry.key)
#set($onlyEventMember = $eventShapeMemberEntry.value.shape)
#end
#end
##the only member is blob member
#if($eventShape.members.size() == 1 && $onlyEventMember.isBlob())
${eventShape.name} event(GetEventPayloadWithOwnership());
m_on${eventShape.name}(event);
break;
##the only member is plain text
#elseif($eventShape.members.size() == 1 && $onlyEventMember.isString())
${eventShape.name} event;
event.Set${onlyEventMemberKey}(GetEventPayloadAsString());
m_on${eventShape.name}(event);
break;
##multiple members or the only one member is structure
#elseif(!$eventShape.members.isEmpty())
JsonValue json(GetEventPayloadAsString());
if (!json.WasParseSuccessful())
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Unable to generate a proper ${eventShape.name} object from the response in JSON format.");
break;
}
m_on${eventShape.name}(${eventShape.name}{json.View()});
break;
#else
m_on${eventShape.name}();
break;
#end
}
#end
#end
default:
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG,
"Unexpected event type: " << eventTypeHeaderIter->second.GetEventHeaderValueAsString());
break;
}
}
void ${operation.name}Handler::HandleErrorInMessage()
{
const auto& headers = GetEventHeaders();
Aws::String errorCode;
Aws::String errorMessage;
auto errorHeaderIter = headers.find(ERROR_CODE_HEADER);
if (errorHeaderIter == headers.end())
{
errorHeaderIter = headers.find(EXCEPTION_TYPE_HEADER);
if (errorHeaderIter == headers.end())
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG,
"Error type was not found in the event message.");
return;
}
}
errorCode = errorHeaderIter->second.GetEventHeaderValueAsString();
errorHeaderIter = headers.find(ERROR_MESSAGE_HEADER);
if (errorHeaderIter == headers.end())
{
errorHeaderIter = headers.find(EXCEPTION_TYPE_HEADER);
if (errorHeaderIter == headers.end())
{
AWS_LOGSTREAM_ERROR(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG,
"Error description was not found in the event message.");
return;
}
JsonValue exceptionPayload(GetEventPayloadAsString());
if (!exceptionPayload.WasParseSuccessful())
{
AWS_LOGSTREAM_ERROR(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Unable to generate a proper ${eventShape.name} object from the response in JSON format.");
auto contentTypeIter = headers.find(Aws::Utils::Event::CONTENT_TYPE_HEADER);
if (contentTypeIter != headers.end())
{
AWS_LOGSTREAM_DEBUG(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Error content-type: " << contentTypeIter->second.GetEventHeaderValueAsString());
}
return;
}
JsonView payloadView(exceptionPayload);
errorMessage = payloadView.ValueExists(MESSAGE_CAMEL_CASE) ?
payloadView.GetString(MESSAGE_CAMEL_CASE) :
payloadView.ValueExists(MESSAGE_LOWER_CASE) ?
payloadView.GetString(MESSAGE_LOWER_CASE) : "";
}
else
{
errorMessage = errorHeaderIter->second.GetEventHeaderValueAsString();
}
MarshallError(errorCode, errorMessage);
}
void ${operation.name}Handler::MarshallError(const Aws::String& errorCode, const Aws::String& errorMessage)
{
${metadata.classNamePrefix}ErrorMarshaller errorMarshaller;
AWSError<CoreErrors> error;
if (errorCode.empty())
{
error = AWSError<CoreErrors>(CoreErrors::UNKNOWN, "", errorMessage, false);
}
else
{
error = errorMarshaller.FindErrorByName(errorCode.c_str());
if (error.GetErrorType() != CoreErrors::UNKNOWN)
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Encountered AWSError '" << errorCode.c_str() << "': " << errorMessage.c_str());
error.SetExceptionName(errorCode);
error.SetMessage(errorMessage);
}
else
{
AWS_LOGSTREAM_WARN(${operation.name.toUpperCase()}_HANDLER_CLASS_TAG, "Encountered Unknown AWSError '" << errorCode.c_str() << "': " << errorMessage.c_str());
error = AWSError<CoreErrors>(CoreErrors::UNKNOWN, errorCode, "Unable to parse ExceptionName: " + errorCode + " Message: " + errorMessage, false);
}
}
m_onError(AWSError<${metadata.classNamePrefix}Errors>(error));
}
namespace ${operation.name}EventMapper
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#if(!$eventMemberEntry.value.shape.isException())
#set($memberKey = $eventMemberEntry.key)
static const int ${memberKey.toUpperCase()}_HASH = Aws::Utils::HashingUtils::HashString("${memberKey}");
#end
#end
${operation.name}EventType Get${operation.name}EventTypeForName(const Aws::String& name)
{
int hashCode = Aws::Utils::HashingUtils::HashString(name.c_str());
#set($elseText = "")
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#if(!$eventMemberEntry.value.shape.isException())
#set($memberKeyUpperCase = $eventMemberEntry.key.toUpperCase())
${elseText}if (hashCode == ${memberKeyUpperCase}_HASH)
{
return ${operation.name}EventType::${memberKeyUpperCase};
}
#set($elseText = "else ")
#end
#end
return ${operation.name}EventType::UNKNOWN;
}
Aws::String GetNameFor${operation.name}EventType(${operation.name}EventType value)
{
switch (value)
{
#foreach($eventMemberEntry in $eventStreamShape.members.entrySet())
#if(!$eventMemberEntry.value.shape.isException())
#set($memberKey = $eventMemberEntry.key)
case ${operation.name}EventType::${memberKey.toUpperCase()}:
return "${memberKey}";
#end
#end
default:
return "Unknown";
}
}
} // namespace ${operation.name}EventMapper
} // namespace Model
} // namespace ${serviceNamespace}
} // namespace ${rootNamespace}

Some files were not shown because too many files have changed in this diff Show More