Skip to content

Commit a0e31b0

Browse files
authored
Fix bunch of OpenAPI generation issues (#2005)
The current way how OpenAPI Java code is generated suffers from a bunch of issues: * Changes to any of the source spec files requires a Gradle `clean`, otherwise old generated Java source will remain - i.e. "no longer" existing sources are not removed. This is addressed by adding an additional action to `GenerateTask`. * The output of `GenerateTask` was explicitly not cached, this is removed, so the output is cached. * Add explicit inputs to `GenerateTask` to the whole templates and spec folders.
1 parent f80b4f3 commit a0e31b0

File tree

5 files changed

+97
-41
lines changed

5 files changed

+97
-41
lines changed

api/iceberg-service/build.gradle.kts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* under the License.
1818
*/
1919

20+
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
21+
2022
plugins {
2123
alias(libs.plugins.openapi.generator)
2224
id("polaris-client")
@@ -49,14 +51,25 @@ dependencies {
4951
compileOnly(libs.microprofile.fault.tolerance.api)
5052
}
5153

54+
val rootDir = rootProject.layout.projectDirectory
55+
val specsDir = rootDir.dir("spec")
56+
val templatesDir = rootDir.dir("server-templates")
57+
// Use a different directory than 'generated/', because OpenAPI generator's `GenerateTask` adds the
58+
// whole directory to its task output, but 'generated/' is not exclusive to that task and in turn
59+
// breaks Gradle's caching.
60+
val generatedDir = project.layout.buildDirectory.dir("generated-openapi")
61+
val generatedOpenApiSrcDir = project.layout.buildDirectory.dir("generated-openapi/src/main/java")
62+
5263
openApiGenerate {
53-
inputSpec = "$rootDir/spec/polaris-catalog-service.yaml"
64+
// The OpenAPI generator does NOT resolve relative paths correctly against the Gradle project
65+
// directory
66+
inputSpec = specsDir.file("polaris-catalog-service.yaml").asFile.absolutePath
5467
generatorName = "jaxrs-resteasy"
55-
outputDir = "$projectDir/build/generated"
68+
outputDir = generatedDir.get().asFile.absolutePath
5669
apiPackage = "org.apache.polaris.service.catalog.api"
57-
ignoreFileOverride = "$rootDir/.openapi-generator-ignore"
70+
ignoreFileOverride = rootDir.file(".openapi-generator-ignore").asFile.absolutePath
5871
removeOperationIdPrefix = true
59-
templateDir = "$rootDir/server-templates"
72+
templateDir = templatesDir.asFile.absolutePath
6073
globalProperties.put("apis", "CatalogApi,ConfigurationApi,OAuth2Api")
6174
globalProperties.put("models", "false")
6275
globalProperties.put("apiDocs", "false")
@@ -109,16 +122,16 @@ openApiGenerate {
109122
)
110123
}
111124

112-
listOf("sourcesJar", "compileJava").forEach { task ->
125+
listOf("sourcesJar", "compileJava", "processResources").forEach { task ->
113126
tasks.named(task) { dependsOn("openApiGenerate") }
114127
}
115128

116-
sourceSets {
117-
main { java { srcDir(project.layout.buildDirectory.dir("generated/src/main/java")) } }
129+
sourceSets { main { java { srcDir(generatedOpenApiSrcDir) } } }
130+
131+
tasks.named<GenerateTask>("openApiGenerate") {
132+
inputs.dir(templatesDir)
133+
inputs.dir(specsDir)
134+
actions.addFirst { delete { delete(generatedDir) } }
118135
}
119136

120137
tasks.named("javadoc") { dependsOn("jandex") }
121-
122-
tasks.named("processResources") { dependsOn("openApiGenerate") }
123-
124-
tasks.named("openApiGenerate") { outputs.cacheIf { false } }

api/management-model/build.gradle.kts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* under the License.
1818
*/
1919

20+
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
21+
2022
plugins {
2123
alias(libs.plugins.openapi.generator)
2224
id("polaris-client")
@@ -36,14 +38,25 @@ dependencies {
3638
testImplementation("com.fasterxml.jackson.core:jackson-databind")
3739
}
3840

41+
val rootDir = rootProject.layout.projectDirectory
42+
val specsDir = rootDir.dir("spec")
43+
val templatesDir = rootDir.dir("server-templates")
44+
// Use a different directory than 'generated/', because OpenAPI generator's `GenerateTask` adds the
45+
// whole directory to its task output, but 'generated/' is not exclusive to that task and in turn
46+
// breaks Gradle's caching.
47+
val generatedDir = project.layout.buildDirectory.dir("generated-openapi")
48+
val generatedOpenApiSrcDir = project.layout.buildDirectory.dir("generated-openapi/src/main/java")
49+
3950
openApiGenerate {
40-
inputSpec = "$rootDir/spec/polaris-management-service.yml"
51+
// The OpenAPI generator does NOT resolve relative paths correctly against the Gradle project
52+
// directory
53+
inputSpec = specsDir.file("polaris-management-service.yml").asFile.absolutePath
4154
generatorName = "jaxrs-resteasy"
42-
outputDir = "$projectDir/build/generated"
55+
outputDir = generatedDir.get().asFile.absolutePath
4356
modelPackage = "org.apache.polaris.core.admin.model"
44-
ignoreFileOverride = "$rootDir/.openapi-generator-ignore"
57+
ignoreFileOverride = rootDir.file(".openapi-generator-ignore").asFile.absolutePath
4558
removeOperationIdPrefix = true
46-
templateDir = "$rootDir/server-templates"
59+
templateDir = templatesDir.asFile.absolutePath
4760
globalProperties.put("apis", "false")
4861
globalProperties.put("models", "")
4962
globalProperties.put("apiDocs", "false")
@@ -64,14 +77,16 @@ openApiGenerate {
6477
serverVariables = mapOf("basePath" to "api/v1")
6578
}
6679

67-
listOf("sourcesJar", "compileJava").forEach { task ->
80+
listOf("sourcesJar", "compileJava", "processResources").forEach { task ->
6881
tasks.named(task) { dependsOn("openApiGenerate") }
6982
}
7083

71-
sourceSets {
72-
main { java { srcDir(project.layout.buildDirectory.dir("generated/src/main/java")) } }
84+
sourceSets { main { java { srcDir(generatedOpenApiSrcDir) } } }
85+
86+
tasks.named<GenerateTask>("openApiGenerate") {
87+
inputs.dir(templatesDir)
88+
inputs.dir(specsDir)
89+
actions.addFirst { delete { delete(generatedDir) } }
7390
}
7491

7592
tasks.named("javadoc") { dependsOn("jandex") }
76-
77-
tasks.named("processResources") { dependsOn("openApiGenerate") }

api/management-service/build.gradle.kts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* under the License.
1818
*/
1919

20+
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
21+
2022
plugins {
2123
alias(libs.plugins.openapi.generator)
2224
id("polaris-client")
@@ -45,15 +47,26 @@ dependencies {
4547
implementation(libs.slf4j.api)
4648
}
4749

50+
val rootDir = rootProject.layout.projectDirectory
51+
val specsDir = rootDir.dir("spec")
52+
val templatesDir = rootDir.dir("server-templates")
53+
// Use a different directory than 'generated/', because OpenAPI generator's `GenerateTask` adds the
54+
// whole directory to its task output, but 'generated/' is not exclusive to that task and in turn
55+
// breaks Gradle's caching.
56+
val generatedDir = project.layout.buildDirectory.dir("generated-openapi")
57+
val generatedOpenApiSrcDir = project.layout.buildDirectory.dir("generated-openapi/src/main/java")
58+
4859
openApiGenerate {
49-
inputSpec = "$rootDir/spec/polaris-management-service.yml"
60+
// The OpenAPI generator does NOT resolve relative paths correctly against the Gradle project
61+
// directory
62+
inputSpec = specsDir.file("polaris-management-service.yml").asFile.absolutePath
5063
generatorName = "jaxrs-resteasy"
51-
outputDir = "$projectDir/build/generated"
64+
outputDir = generatedDir.get().asFile.absolutePath
5265
apiPackage = "org.apache.polaris.service.admin.api"
5366
modelPackage = "org.apache.polaris.core.admin.model"
54-
ignoreFileOverride = "$rootDir/.openapi-generator-ignore"
67+
ignoreFileOverride = rootDir.file(".openapi-generator-ignore").asFile.absolutePath
5568
removeOperationIdPrefix = true
56-
templateDir = "$rootDir/server-templates"
69+
templateDir = templatesDir.asFile.absolutePath
5770
globalProperties.put("apis", "")
5871
globalProperties.put("models", "false")
5972
globalProperties.put("apiDocs", "false")
@@ -70,14 +83,16 @@ openApiGenerate {
7083
serverVariables.put("basePath", "api/v1")
7184
}
7285

73-
listOf("sourcesJar", "compileJava").forEach { task ->
86+
listOf("sourcesJar", "compileJava", "processResources").forEach { task ->
7487
tasks.named(task) { dependsOn("openApiGenerate") }
7588
}
7689

77-
sourceSets {
78-
main { java { srcDir(project.layout.buildDirectory.dir("generated/src/main/java")) } }
90+
sourceSets { main { java { srcDir(generatedOpenApiSrcDir) } } }
91+
92+
tasks.named<GenerateTask>("openApiGenerate") {
93+
inputs.dir(templatesDir)
94+
inputs.dir(specsDir)
95+
actions.addFirst { delete { delete(generatedDir) } }
7996
}
8097

8198
tasks.named("javadoc") { dependsOn("jandex") }
82-
83-
tasks.named("processResources") { dependsOn("openApiGenerate") }

api/polaris-catalog-service/build.gradle.kts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* under the License.
1818
*/
1919

20+
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
21+
2022
plugins {
2123
alias(libs.plugins.openapi.generator)
2224
id("polaris-client")
@@ -75,15 +77,26 @@ dependencies {
7577
compileOnly(libs.microprofile.fault.tolerance.api)
7678
}
7779

80+
val rootDir = rootProject.layout.projectDirectory
81+
val specsDir = rootDir.dir("spec")
82+
val templatesDir = rootDir.dir("server-templates")
83+
// Use a different directory than 'generated/', because OpenAPI generator's `GenerateTask` adds the
84+
// whole directory to its task output, but 'generated/' is not exclusive to that task and in turn
85+
// breaks Gradle's caching.
86+
val generatedDir = project.layout.buildDirectory.dir("generated-openapi")
87+
val generatedOpenApiSrcDir = project.layout.buildDirectory.dir("generated-openapi/src/main/java")
88+
7889
openApiGenerate {
79-
inputSpec = "$rootDir/spec/polaris-catalog-service.yaml"
90+
// The OpenAPI generator does NOT resolve relative paths correctly against the Gradle project
91+
// directory
92+
inputSpec = specsDir.file("polaris-catalog-service.yaml").asFile.absolutePath
8093
generatorName = "jaxrs-resteasy"
81-
outputDir = "$projectDir/build/generated"
94+
outputDir = generatedDir.get().asFile.absolutePath
8295
apiPackage = "org.apache.polaris.service.catalog.api"
8396
modelPackage = "org.apache.polaris.service.types"
84-
ignoreFileOverride = "$rootDir/.openapi-generator-ignore"
97+
ignoreFileOverride = rootDir.file(".openapi-generator-ignore").asFile.absolutePath
8598
removeOperationIdPrefix = true
86-
templateDir = "$rootDir/server-templates"
99+
templateDir = templatesDir.asFile.absolutePath
87100
globalProperties.put("apis", "GenericTableApi,PolicyApi")
88101
globalProperties.put("models", models)
89102
globalProperties.put("apiDocs", "false")
@@ -112,16 +125,16 @@ openApiGenerate {
112125
)
113126
}
114127

115-
listOf("sourcesJar", "compileJava").forEach { task ->
128+
listOf("sourcesJar", "compileJava", "processResources").forEach { task ->
116129
tasks.named(task) { dependsOn("openApiGenerate") }
117130
}
118131

119-
sourceSets {
120-
main { java { srcDir(project.layout.buildDirectory.dir("generated/src/main/java")) } }
132+
sourceSets { main { java { srcDir(generatedOpenApiSrcDir) } } }
133+
134+
tasks.named<GenerateTask>("openApiGenerate") {
135+
inputs.dir(templatesDir)
136+
inputs.dir(specsDir)
137+
actions.addFirst { delete { delete(generatedDir) } }
121138
}
122139

123140
tasks.named("javadoc") { dependsOn("jandex") }
124-
125-
tasks.named("processResources") { dependsOn("openApiGenerate") }
126-
127-
tasks.named("openApiGenerate") { outputs.cacheIf { false } }

build-logic/src/main/kotlin/polaris-java.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ tasks.withType(JavaCompile::class.java).configureEach {
6060
options.errorprone.disableAllWarnings = true
6161
options.errorprone.disableWarningsInGeneratedCode = true
6262
options.errorprone.excludedPaths =
63-
".*/${project.layout.buildDirectory.get().asFile.relativeTo(projectDir)}/generated/.*"
63+
".*/${project.layout.buildDirectory.get().asFile.relativeTo(projectDir)}/generated(-openapi)?/.*"
6464
val errorproneRules = rootProject.projectDir.resolve("codestyle/errorprone-rules.properties")
6565
inputs.file(errorproneRules).withPathSensitivity(PathSensitivity.RELATIVE)
6666
options.errorprone.checks.putAll(provider { memoizedErrorproneRules(errorproneRules) })

0 commit comments

Comments
 (0)