Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions tools/code-generation/smithy/cpp-codegen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()

Expand All @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<T> {
protected final ServiceShape service;
protected final List<T> operations;
protected final Map<String, String> serviceMap;
protected final String smithyServiceName;
protected final Map<String, String> namespaceMap;

public BaseHeaderGenerator(ServiceShape service, List<T> operations, Map<String, String> serviceMap) {
public BaseHeaderGenerator(ServiceShape service, List<T> operations, Map<String, String> serviceMap, Map<String, String> 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);
Expand All @@ -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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@
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<T> {
private final PluginContext context;
private final ServiceShape service;
private final List<T> operations;
private final CppWriterDelegator writerDelegator;
private final Map<String, String> serviceMap;
private final Map<String, String> namespaceMap;
private final String featureName;

public FeatureParser(PluginContext context, ServiceShape service, List<T> operations, String featureName) {
Expand All @@ -40,6 +43,15 @@ public FeatureParser(PluginContext context, ServiceShape service, List<T> 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<FeatureParser<T>> generationLogic) {
Expand All @@ -64,4 +76,10 @@ public void generateClientHeader(String fileName, Consumer<CppWriter> generator)
public Map<String, String> getServiceMap() { return serviceMap; }
public String getServiceName() { return ServiceNameUtil.getServiceName(service); }
public String getSmithyServiceName() { return ServiceNameUtil.getSmithyServiceName(service, serviceMap); }
}
public Map<String, String> 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("/", "");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

public class PaginationBaseGenerator extends BaseHeaderGenerator<OperationData<PaginatedTrait>> {

public PaginationBaseGenerator(ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, Map<String, String> serviceMap) {
super(service, paginatedOps, serviceMap);
public PaginationBaseGenerator(ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, Map<String, String> serviceMap, Map<String, String> namespaceMap) {
super(service, paginatedOps, serviceMap, namespaceMap);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

public class PaginationClientHeaderGenerator extends BaseHeaderGenerator<OperationData<PaginatedTrait>> {

public PaginationClientHeaderGenerator(ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, Map<String, String> serviceMap) {
super(service, paginatedOps, serviceMap);
public PaginationClientHeaderGenerator(ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, Map<String, String> serviceMap, Map<String, String> namespaceMap) {
super(service, paginatedOps, serviceMap, namespaceMap);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,22 +60,23 @@ 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
PaginationTraitsGenerator traitsGenerator = new PaginationTraitsGenerator(
featureParser.getContext(),
featureParser.getService(),
featureParser.getOperations(),
featureParser.getSmithyServiceName()
featureParser.getSmithyServiceName(),
featureParser.getNamespaceMap()
);
traitsGenerator.write();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<OperationData<PaginatedTrait>> {

private final List<TokenResolver> resolvers;
private final Map<String, String> namespaceMap;

public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, String smithyServiceName) {
public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List<OperationData<PaginatedTrait>> paginatedOps, String smithyServiceName, Map<String, String> namespaceMap) {
super(context, service, paginatedOps, smithyServiceName);
this.resolvers = List.of(
// Pattern A: Nested token
Expand Down Expand Up @@ -57,6 +59,7 @@ public void writeLogic(CppWriter writer, String token, OperationShape op) {
}
}
);
this.namespaceMap = namespaceMap;
}

@Override
Expand Down Expand Up @@ -85,7 +88,7 @@ protected void generateOperationContent(CppWriter writer, OperationData<Paginate

// Namespaces
writer.writeNamespaceOpen("Aws")
.writeNamespaceOpen(serviceName)
.writeNamespaceOpen(Optional.ofNullable(namespaceMap.get(smithyServiceName)).orElse(serviceName))
.writeNamespaceOpen("Pagination")
.write("");

Expand Down Expand Up @@ -120,7 +123,7 @@ protected void generateOperationContent(CppWriter writer, OperationData<Paginate

writer.write("");
writer.writeNamespaceClose("Pagination");
writer.writeNamespaceClose(serviceName);
writer.writeNamespaceClose(Optional.ofNullable(namespaceMap.get(smithyServiceName)).orElse(serviceName));
writer.writeNamespaceClose("Aws");
}

Expand Down
149 changes: 149 additions & 0 deletions tools/code-generation/smithy/mapping/smithy-namespace-mapping.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
{
"monitoring": "CloudWatch",
"codepipeline": "CodePipeline",
"awstransfer": "AWS Transfer",
"sns": "Amazon SNS",
"snowball": "Amazon Snowball",
"lexv2-runtime": "Lex Runtime V2",
"connect-contact-lens": "Amazon Connect Contact Lens",
"finspace-data": "FinSpace Data",
"servicediscovery": "ServiceDiscovery",
"ecr": "Amazon ECR",
"firehose": "Firehose",
"timestream-write": "Timestream Write",
"acm": "ACM",
"swf": "Amazon SWF",
"imagebuilder": "imagebuilder",
"config": "Config Service",
"connectcases": "ConnectCases",
"sts": "AWS STS",
"customer-profiles": "Customer Profiles",
"docdb-elastic": "DocDB Elastic",
"elasticbeanstalk": "Elastic Beanstalk",
"kinesis-video-media": "Kinesis Video Media",
"waf-regional": "WAF Regional",
"elasticfilesystem": "EFS",
"ivs-realtime": "ivsrealtime",
"elasticmapreduce": "Amazon EMR",
"kafkaconnect": "Kafka Connect",
"ecs": "Amazon ECS",
"sms-voice": "Pinpoint SMS Voice",
"partnercentral-benefits": "PartnerCentral Benefits",
"rds": "Amazon RDS",
"greengrassv2": "AWS GreengrassV2",
"cloudfront": "CloudFront",
"marketplace-catalog": "AWS Marketplace Catalog",
"ec2": "Amazon EC2",
"memorydb": "Amazon MemoryDB",
"codeguru-reviewer": "CodeGuruReviewer",
"kinesis-video-archived-media": "Kinesis Video Archived Media",
"datasync": "DataSync",
"email": "Amazon SES",
"ssm-sap": "SsmSap",
"mediapackage-vod": "MediaPackage Vod",
"network-firewall": "Network Firewall",
"sso": "SSO",
"medialive": "MediaLive",
"route53": "Route 53",
"kinesis-video-signaling": "Amazon Kinesis Video Signaling Channels",
"inspector-scan": "inspector-scan",
"mgn": "mgn",
"fms": "FMS",
"rtbfabric": "RTBFabric",
"pi": "AWS PI",
"support-app": "SupportApp",
"s3outposts": "Amazon S3 Outposts",
"cloudtrail": "CloudTrail",
"iotdeviceadvisor": "AWSIoTDeviceAdvisor",
"sso-oidc": "SSO OIDC",
"mturk-requester": "Amazon MTurk",
"evs": "EVS",
"cloudcontrol": "CloudControlApi",
"route53resolver": "Route53Resolver",
"elasticloadbalancingv2": "Elastic Load Balancing v2",
"resource-groups": "Resource Groups",
"mediaconvert": "MediaConvert",
"neptune": "Amazon Neptune",
"timestream-query": "Timestream Query",
"sesv2": "Amazon SES V2",
"application-insights": "Application Insights",
"mediatailor": "MediaTailor",
"synthetics": "Synthetics",
"pinpoint-email": "Pinpoint Email",
"codedeploy": "CodeDeploy",
"kinesisanalytics": "Kinesis Analytics",
"ce": "AWS Cost Explorer",
"pricing": "AWS Pricing",
"ram": "RAM",
"ec2-instance-connect": "EC2 Instance Connect",
"health": "AWSHealth",
"ssm-contacts": "SSM Contacts",
"ivschat": "ivschat",
"waf": "WAF",
"s3": "Amazon S3",
"s3-crt": "S3Crt",
"entityresolution": "AWSEntityResolution",
"lookoutequipment": "LookoutEquipment",
"kendra": "kendra",
"inspector2": "Inspector2",
"healthlake": "HealthLake",
"amplify": "Amplify",
"dynamodb": "DynamoDB",
"states": "AWS SFN",
"drs": "drs",
"appconfig": "AppConfig",
"timestream-influxdb": "Timestream InfluxDB",
"acm-pca": "ACM-PCA",
"budgets": "AWSBudgets",
"networkmanager": "NetworkManager",
"comprehendmedical": "ComprehendMedical",
"cloudhsmv2": "CloudHSM V2",
"ivs": "Amazon IVS",
"kms": "KMS",
"iam": "IAM",
"cloudhsm": "CloudHSM",
"wellarchitected": "Well-Architected",
"servicecatalog-appregistry": "AppRegistry",
"mediapackagev2": "mediapackagev2",
"sqs": "Amazon SQS",
"fis": "FIS",
"ecr-public": "Amazon ECR Public",
"shield": "AWS Shield",
"kinesis": "Kinesis",
"connect": "Amazon Connect",
"sagemaker": "SageMaker",
"marketplace-agreement": "Agreement Service",
"signer": "signer",
"ssm-incidents": "SSM Incidents",
"neptune-graph": "Neptune Graph",
"kinesisvideo": "Kinesis Video",
"ssm": "Amazon SSM",
"lexv2-models": "Lex Models V2",
"dlm": "Amazon DLM",
"connectparticipant": "Amazon Connect Participant",
"identitystore": "IdentityStore",
"kinesisanalyticsv2": "Kinesis Analytics V2",
"docdb": "Amazon DocDB",
"appsync": "AWSAppSync",
"codecommit": "CodeCommit",
"ebs": "Amazon EBS",
"b2bi": "AWS B2BI",
"managedblockchain": "ManagedBlockchain",
"mediastore-data": "MediaStore Data",
"savingsplans": "AWSSavingsPlans",
"organizations": "Organizations",
"ds": "Directory Service",
"dax": "Amazon DAX",
"mediapackage": "MediaPackage",
"kafka": "Kafka",
"wafv2": "WAFV2",
"eks": "Amazon EKS",
"mediastore": "MediaStore",
"outposts": "Outposts",
"sagemaker-metrics": "SageMaker Metrics",
"sso-admin": "SSO Admin",
"batch": "AWS Batch",
"panorama": "Panorama",
"finspace": "finspace",
"kendra-ranking": "Kendra Ranking"
}
Loading
Loading