1- import software.amazon.smithy.model.Model
2- import software.amazon.smithy.model.node.Node
3- import software.amazon.smithy.model.shapes.ServiceShape
4- import software.amazon.smithy.aws.traits.ServiceTrait
5- import org.gradle.api.logging.Logging
6- import kotlin.streams.toList
7-
8- val logger = Logging .getLogger(" MyLogger" )
9-
101plugins {
112 id(" java-library" )
12- id(" software.amazon.smithy.gradle.smithy-base" ).version(" 1.3.0" )
133}
144
155repositories {
@@ -22,101 +12,9 @@ allprojects {
2212 version = " 0.1.0"
2313}
2414
25- buildscript {
26- dependencies {
27- classpath(codegen.model)
28- classpath(codegen.aws.traits)
29- classpath(codegen.aws.smoke.test.model)
30- classpath(codegen.rules.engine)
31- }
32- }
33-
3415dependencies {
35- implementation(project(" :cpp-pagination-codegen" ))
36- implementation(codegen.aws.traits)
37- implementation(codegen.aws.cloudformation.traits)
38- implementation(codegen.aws.iam.traits)
39- implementation(codegen.aws.endpoints)
40- implementation(codegen.waiters)
41- implementation(codegen.smoke.test.traits)
42- implementation(codegen.aws.smoke.test.model)
4316}
4417
45- tasks.jar {
46- enabled = false
47- }
48-
49- // Generates a smithy-build.json with a projection for each service, including
50- // only that service's model.
51- tasks.register(" generate-smithy-build" ) {
52- doLast {
53- val projectionsBuilder = Node .objectNodeBuilder()
54- val models = project.file(" ../api-descriptions" )
55- val filteredServices: String = project.findProperty(" servicesFilter" )?.toString() ? : " "
56- val filteredServiceList = filteredServices.split(" ," ).map { it.trim() }.filter { it.isNotEmpty() }
57- val c2jMapStr: String = project.findProperty(" c2jMap" )?.toString() ? : " "
58-
59- fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file ->
60- val model = Model .assembler()
61- .addImport(file.absolutePath)
62- // Grab the result directly rather than worrying about checking for errors via unwrap.
63- // All we care about here is the service shape, any unchecked errors will be exposed
64- // as part of the actual build task done by the smithy gradle plugin.
65- .assemble().result.get()
66- val services = model.shapes(ServiceShape ::class .java).sorted().toList()
67- if (services.size != 1 ) return @eachFile
68-
69- val service = services[0 ]
70- val serviceTrait = service.getTrait(ServiceTrait ::class .java).get()
71-
72- // Clean up sdkId
73- val sdkId = serviceTrait.sdkId.replace(" " , " -" ).replace(" _" , " -" ).lowercase()
74-
75- // Filter by service id if necessary
76- if (filteredServiceList.isNotEmpty() && sdkId !in filteredServiceList) return @eachFile
77-
78- // Create projection contents
79- val projectionContents = Node .objectNodeBuilder()
80- .withMember(" imports" , Node .fromStrings(" ${models.absolutePath}${File .separator}${file.name} " ))
81- .withMember(" plugins" , Node .objectNode()
82- .withMember(" cpp-codegen-pagination-plugin" , Node .objectNodeBuilder()
83- .withMember(" c2jMap" , Node .from(c2jMapStr))
84- .build()))
85- .build()
86-
87- // Add the projection contents to the projections builder
88- projectionsBuilder.withMember(" $sdkId .${service.version.lowercase()} " , projectionContents)
89- }
90-
91- // TODO: Remove this workaround - legacy services should have proper Smithy model files
92- // instead of hardcoding service names in both Gradle and Java
93- // Currently only needed for importexport, sdb (SimpleDB), and s3-crt
94- // Add mock projections for legacy C2J-only services
95- val legacyServices = mapOf (" importexport" to " ImportExport" , " sdb" to " SimpleDB" , " s3-crt" to " S3Crt" )
96- legacyServices.forEach { (c2jName, pascalName) ->
97- if (filteredServiceList.isEmpty() || c2jName in filteredServiceList) {
98- val mockProjectionContents = Node .objectNodeBuilder()
99- .withMember(" plugins" , Node .objectNode()
100- .withMember(" cpp-codegen-pagination-plugin" , Node .objectNodeBuilder()
101- .withMember(" c2jMap" , Node .from(c2jMapStr))
102- .build()))
103- .build()
104- projectionsBuilder.withMember(" $c2jName .mock" , mockProjectionContents)
105- }
106- }
107-
108- val outputDirectoryArg = project.findProperty(" outputDirectory" )?.toString() ? : " output"
109- file(" smithy-build.json" ).writeText(Node .prettyPrintJson(Node .objectNodeBuilder()
110- .withMember(" version" , " 1.0" )
111- .withMember(" projections" , projectionsBuilder.build())
112- .withMember(" outputDirectory" , outputDirectoryArg)
113- .build()))
114- }
115- }
116-
117- // Generate smithy-build.json before running the build
118- tasks[" build" ].dependsOn(tasks[" generate-smithy-build" ])
119-
12018// Prevent cpp-smoke-tests from building when root build is invoked
12119project(" :cpp-smoke-tests" ).tasks.configureEach {
12220 enabled = false
0 commit comments