diff --git a/tools/code-generation/smithy/cpp-codegen/build.gradle.kts b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts index cc1faf7bcbf..11a2caa8737 100644 --- a/tools/code-generation/smithy/cpp-codegen/build.gradle.kts +++ b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts @@ -43,6 +43,7 @@ tasks.register("generate-smithy-build") { val filteredServices: String = project.findProperty("servicesFilter")?.toString() ?: "" val filteredServiceList = filteredServices.split(",").map { it.trim() }.filter { it.isNotEmpty() } val c2jMapStr: String = project.findProperty("c2jMap")?.toString() ?: "" + val namespaceMappings: String = project.findProperty("namespaceMappings")?.toString() ?: "" fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file -> val model = Model.assembler() @@ -62,6 +63,7 @@ tasks.register("generate-smithy-build") { .withMember("plugins", Node.objectNode() .withMember("smithy-cpp-codegen", Node.objectNodeBuilder() .withMember("c2jMap", Node.from(c2jMapStr)) + .withMember("namespaceMappings", Node.from(namespaceMappings)) .build())) .build() @@ -76,6 +78,7 @@ tasks.register("generate-smithy-build") { .withMember("plugins", Node.objectNode() .withMember("smithy-cpp-codegen", Node.objectNodeBuilder() .withMember("c2jMap", Node.from(c2jMapStr)) + .withMember("namespaceMappings", Node.from(namespaceMappings)) .build())) .build() projectionsBuilder.withMember("$c2jName.mock", mockProjectionContents) @@ -90,6 +93,7 @@ tasks.register("generate-smithy-build") { .withMember("plugins", Node.objectNode() .withMember("smithy-cpp-codegen", Node.objectNodeBuilder() .withMember("c2jMap", Node.from(c2jMapStr)) + .withMember("namespaceMappings", Node.from(namespaceMappings)) .build())) .build() projectionsBuilder.withMember("s3-crt.2006-03-01", s3CrtProjectionContents) diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java index ebbb6a235c7..e549174a829 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java @@ -5,22 +5,24 @@ package com.amazonaws.util.awsclientsmithygenerator.generators; import software.amazon.smithy.model.shapes.ServiceShape; -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; + import java.util.List; import java.util.Map; +import java.util.Optional; public abstract class BaseHeaderGenerator { protected final ServiceShape service; protected final List operations; protected final Map serviceMap; protected final String smithyServiceName; + protected final Map namespaceMap; - public BaseHeaderGenerator(ServiceShape service, List operations, Map serviceMap) { + public BaseHeaderGenerator(ServiceShape service, List operations, Map serviceMap, Map namespaceMap) { this.service = service; this.operations = operations; this.serviceMap = serviceMap; this.smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + this.namespaceMap = namespaceMap; } protected abstract void writeSpecificIncludes(CppWriter writer, String serviceName, String smithyServiceName); @@ -47,12 +49,12 @@ private void writeHeader(CppWriter writer) { private void writeNamespaceOpen(CppWriter writer, String serviceName) { writer.writeNamespaceOpen("Aws"); - writer.writeNamespaceOpen(serviceName); + writer.writeNamespaceOpen(Optional.ofNullable(namespaceMap.get(smithyServiceName)).orElse(serviceName)); writer.write(""); } private void writeNamespaceClose(CppWriter writer, String serviceName) { - writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose(Optional.ofNullable(namespaceMap.get(smithyServiceName)).orElse(serviceName)); writer.writeNamespaceClose("Aws"); } } \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java index 6d76901b024..1fe61b5caf5 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java @@ -9,8 +9,10 @@ import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.shapes.*; import software.amazon.smithy.aws.traits.ServiceTrait; + import java.util.*; import java.util.function.Consumer; +import java.util.stream.Collectors; public class FeatureParser { private final PluginContext context; @@ -18,6 +20,7 @@ public class FeatureParser { private final List operations; private final CppWriterDelegator writerDelegator; private final Map serviceMap; + private final Map namespaceMap; private final String featureName; public FeatureParser(PluginContext context, ServiceShape service, List operations, String featureName) { @@ -40,6 +43,15 @@ public FeatureParser(PluginContext context, ServiceShape service, List operat }); } } + + this.namespaceMap = settings.getMember("namespaceMappings") + .map(node -> node.expectStringNode().getValue()) + .map(jsonStr -> Node.parseJsonWithComments(jsonStr).expectObjectNode()) + .map(node -> node.getMembers().entrySet().stream() + .collect(Collectors.toMap( + entry -> entry.getKey().getValue(), + entry -> sanitizeServiceAbbreviation(entry.getValue().expectStringNode().getValue())))) + .orElse(Map.of()); } public void run(Consumer> generationLogic) { @@ -64,4 +76,10 @@ public void generateClientHeader(String fileName, Consumer generator) public Map getServiceMap() { return serviceMap; } public String getServiceName() { return ServiceNameUtil.getServiceName(service); } public String getSmithyServiceName() { return ServiceNameUtil.getSmithyServiceName(service, serviceMap); } -} \ No newline at end of file + public Map getNamespaceMap() { return namespaceMap; } + + // In reference to ServiceNameUtil.sanitizeServiceAbbreviation such that we get the same namepsace name as C2J + private static String sanitizeServiceAbbreviation(final String serviceAbbreviation) { + return serviceAbbreviation.replace(" ", "").replace("-", "").replace("_", "").replace("Amazon", "").replace("AWS", "").replace("/", ""); + } +} diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java index dd78fce6104..b39a3762dd0 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java @@ -16,8 +16,8 @@ public class PaginationBaseGenerator extends BaseHeaderGenerator> { - public PaginationBaseGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { - super(service, paginatedOps, serviceMap); + public PaginationBaseGenerator(ServiceShape service, List> paginatedOps, Map serviceMap, Map namespaceMap) { + super(service, paginatedOps, serviceMap, namespaceMap); } @Override diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java index a18c63b1e28..26f55f089b0 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java @@ -16,8 +16,8 @@ public class PaginationClientHeaderGenerator extends BaseHeaderGenerator> { - public PaginationClientHeaderGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { - super(service, paginatedOps, serviceMap); + public PaginationClientHeaderGenerator(ServiceShape service, List> paginatedOps, Map serviceMap, Map namespaceMap) { + super(service, paginatedOps, serviceMap, namespaceMap); } @Override diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java index b7e0a468361..8c208604ac2 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java @@ -60,14 +60,14 @@ public void execute(PluginContext context) { // Generate CRTP pagination (always, even if empty) featureParser.generateClientHeader( serviceName + "PaginationBase.h", - writer -> new PaginationBaseGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap()).render(writer) + writer -> new PaginationBaseGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap(), featureParser.getNamespaceMap()).render(writer) ); if (!paginatedOps.isEmpty()) { // Generate client pagination header featureParser.generateClientHeader( serviceName + "ClientPagination.h", - writer -> new PaginationClientHeaderGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap()).render(writer) + writer -> new PaginationClientHeaderGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap(), featureParser.getNamespaceMap()).render(writer) ); // Generate pagination traits headers @@ -75,7 +75,8 @@ public void execute(PluginContext context) { featureParser.getContext(), featureParser.getService(), featureParser.getOperations(), - featureParser.getSmithyServiceName() + featureParser.getSmithyServiceName(), + featureParser.getNamespaceMap() ); traitsGenerator.write(); } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java index befd6b0bf1f..8c0f1a294ea 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java @@ -13,13 +13,15 @@ import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; import java.util.List; +import java.util.Map; import java.util.Optional; public class PaginationTraitsGenerator extends BaseTraitsGenerator> { private final List resolvers; + private final Map namespaceMap; - public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List> paginatedOps, String smithyServiceName) { + public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List> paginatedOps, String smithyServiceName, Map namespaceMap) { super(context, service, paginatedOps, smithyServiceName); this.resolvers = List.of( // Pattern A: Nested token @@ -57,6 +59,7 @@ public void writeLogic(CppWriter writer, String token, OperationShape op) { } } ); + this.namespaceMap = namespaceMap; } @Override @@ -85,7 +88,7 @@ protected void generateOperationContent(CppWriter writer, OperationData