|
4 | 4 | package software.aws.toolkits.gradle.sdk
|
5 | 5 |
|
6 | 6 | import org.gradle.api.DefaultTask
|
| 7 | +import org.gradle.api.Plugin |
| 8 | +import org.gradle.api.Project |
| 9 | +import org.gradle.api.file.DirectoryProperty |
| 10 | +import org.gradle.api.plugins.JavaPlugin |
| 11 | +import org.gradle.api.plugins.JavaPluginConvention |
7 | 12 | import org.gradle.api.tasks.InputDirectory
|
| 13 | +import org.gradle.api.tasks.Internal |
8 | 14 | import org.gradle.api.tasks.OutputDirectory
|
| 15 | +import org.gradle.api.tasks.SourceSet |
9 | 16 | import org.gradle.api.tasks.TaskAction
|
| 17 | +import org.gradle.plugins.ide.idea.model.IdeaModel |
10 | 18 | import software.amazon.awssdk.codegen.C2jModels
|
11 | 19 | import software.amazon.awssdk.codegen.CodeGenerator
|
12 | 20 | import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig
|
13 | 21 | import software.amazon.awssdk.codegen.model.service.Paginators
|
14 | 22 | import software.amazon.awssdk.codegen.model.service.ServiceModel
|
| 23 | +import software.amazon.awssdk.codegen.model.service.Waiters |
15 | 24 | import software.amazon.awssdk.codegen.utils.ModelLoaderUtils
|
16 |
| -import java.io.File |
| 25 | + |
| 26 | +open class GenerateSdkExtension(project: Project) { |
| 27 | + val c2jFolder: DirectoryProperty = project.objects.directoryProperty() |
| 28 | + |
| 29 | + val outputDir: DirectoryProperty = project.objects.directoryProperty() |
| 30 | + |
| 31 | + fun srcDir() = outputDir.dir("src") |
| 32 | + fun tsDir() = outputDir.dir("tst") |
| 33 | +} |
| 34 | + |
| 35 | +@Suppress("unused") // Plugin is created by buildSrc/build.gradle |
| 36 | +class GenerateSdkPlugin : Plugin<Project> { |
| 37 | + override fun apply(project: Project) { |
| 38 | + project.pluginManager.apply(JavaPlugin::class.java) |
| 39 | + |
| 40 | + val extension = project.extensions.create("sdkGenerator", GenerateSdkExtension::class.java, project) |
| 41 | + extension.c2jFolder.convention(project.layout.projectDirectory.dir("codegen-resources")) |
| 42 | + extension.outputDir.convention(project.layout.buildDirectory.dir("generated-sources")) |
| 43 | + |
| 44 | + val generateSdkTask = project.tasks.create("generateSdk", GenerateSdk::class.java) |
| 45 | + |
| 46 | + val javaConvention = project.convention.getPlugin(JavaPluginConvention::class.java) |
| 47 | + val mainSourceSet = javaConvention.sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) |
| 48 | + mainSourceSet.java.srcDir(generateSdkTask.srcDir) |
| 49 | + project.tasks.getByName(mainSourceSet.compileJavaTaskName).dependsOn(generateSdkTask) |
| 50 | + |
| 51 | + val ideaModel = project.extensions.getByType(IdeaModel::class.java) |
| 52 | + ideaModel.module.generatedSourceDirs.add(generateSdkTask.srcDir.get().asFile) |
| 53 | + } |
| 54 | +} |
17 | 55 |
|
18 | 56 | open class GenerateSdk : DefaultTask() {
|
19 | 57 | @InputDirectory
|
20 |
| - lateinit var c2jFolder: File |
| 58 | + val c2jFolder: DirectoryProperty = project.objects.directoryProperty().convention(project.extensions.getByType(GenerateSdkExtension::class.java).c2jFolder) |
21 | 59 |
|
22 | 60 | @OutputDirectory
|
23 |
| - lateinit var outputDir: File |
| 61 | + val srcDir: DirectoryProperty = project.objects.directoryProperty().convention(project.extensions.getByType(GenerateSdkExtension::class.java).srcDir()) |
| 62 | + |
| 63 | + @Internal |
| 64 | + val testDir: DirectoryProperty = project.objects.directoryProperty().convention(project.extensions.getByType(GenerateSdkExtension::class.java).tsDir()) |
24 | 65 |
|
25 | 66 | @TaskAction
|
26 | 67 | fun generate() {
|
27 |
| - outputDir.deleteRecursively() |
| 68 | + val srcDir = srcDir.asFile.get() |
| 69 | + val testDir = testDir.asFile.get() |
| 70 | + srcDir.deleteRecursively() |
| 71 | + testDir.deleteRecursively() |
28 | 72 |
|
29 |
| - logger.info("Generating SDK from $c2jFolder") |
| 73 | + logger.info("Generating SDK from ${c2jFolder.get().asFile}") |
30 | 74 | val models = C2jModels.builder()
|
31 | 75 | .serviceModel(loadServiceModel())
|
32 | 76 | .paginatorsModel(loadPaginatorsModel())
|
33 | 77 | .customizationConfig(loadCustomizationConfig())
|
| 78 | + .waitersModel(loadWaitersModel()) |
34 | 79 | .build()
|
35 | 80 |
|
36 | 81 | CodeGenerator.builder()
|
37 | 82 | .models(models)
|
38 |
| - .sourcesDirectory(outputDir.absolutePath) |
| 83 | + .sourcesDirectory(srcDir.absolutePath) |
| 84 | + .testsDirectory(testDir.absolutePath) |
39 | 85 | .build()
|
40 | 86 | .execute()
|
41 | 87 | }
|
42 | 88 |
|
43 |
| - private fun loadServiceModel(): ServiceModel? = |
44 |
| - ModelLoaderUtils.loadModel(ServiceModel::class.java, File(c2jFolder, "service-2.json")) |
| 89 | + private fun loadServiceModel(): ServiceModel? = ModelLoaderUtils.loadModel(ServiceModel::class.java, c2jFolder.file("service-2.json").get().asFile) |
45 | 90 |
|
46 | 91 | private fun loadPaginatorsModel(): Paginators? {
|
47 |
| - val paginatorsFile = File(c2jFolder, "paginators-1.json") |
48 |
| - if (paginatorsFile.exists()) |
49 |
| - return ModelLoaderUtils.loadModel(Paginators::class.java, paginatorsFile) |
50 |
| - return null |
| 92 | + val paginatorsFile = c2jFolder.file("paginators-1.json").orNull?.asFile |
| 93 | + return if (paginatorsFile?.exists() == true) { |
| 94 | + ModelLoaderUtils.loadModel(Paginators::class.java, paginatorsFile) |
| 95 | + } else { |
| 96 | + null |
| 97 | + } |
| 98 | + } |
| 99 | + |
| 100 | + private fun loadWaitersModel(): Waiters? { |
| 101 | + val waitersFile = c2jFolder.file("waiters-2.json").orNull?.asFile |
| 102 | + return if (waitersFile?.exists() == true) { |
| 103 | + ModelLoaderUtils.loadModel(Waiters::class.java, waitersFile) |
| 104 | + } else { |
| 105 | + null |
| 106 | + } |
51 | 107 | }
|
52 | 108 |
|
53 | 109 | private fun loadCustomizationConfig(): CustomizationConfig = ModelLoaderUtils.loadOptionalModel(
|
54 | 110 | CustomizationConfig::class.java,
|
55 |
| - File(c2jFolder, "customization.config") |
| 111 | + c2jFolder.file("customization.config").get().asFile |
56 | 112 | ).orElse(CustomizationConfig.create())
|
57 | 113 | }
|
0 commit comments