Skip to content

Commit 0c25ee6

Browse files
committed
Merge branch 'nhajratw-cleanup'
2 parents 5aea7b9 + 7b3eb5c commit 0c25ee6

File tree

4 files changed

+136
-110
lines changed

4 files changed

+136
-110
lines changed

Diff for: src/main/kotlin/org/springdoc/openapi/gradle/plugin/AnnotatedFork.kt

+20-20
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,29 @@ import org.gradle.process.CommandLineArgumentProvider
1515
* Groovy methods that get added to Groovy classes via bytecode manipulation.
1616
*/
1717
open class AnnotatedFork : Fork() {
18-
private var metaClass: MetaClass? = null
18+
private var metaClass: MetaClass? = null
1919

20-
override fun invokeMethod(method: String?, args: Any?): Any? {
21-
return InvokerHelper.invokeMethod(this, method, args)
22-
}
20+
override fun invokeMethod(method: String?, args: Any?): Any? {
21+
return InvokerHelper.invokeMethod(this, method, args)
22+
}
2323

24-
override fun getProperty(property: String?): Any? {
25-
return InvokerHelper.getProperty(this, property)
26-
}
24+
override fun getProperty(property: String?): Any? {
25+
return InvokerHelper.getProperty(this, property)
26+
}
2727

28-
override fun getMetaClass(): MetaClass? {
29-
if (metaClass == null) {
30-
metaClass = InvokerHelper.getMetaClass(javaClass)
31-
}
32-
return metaClass
33-
}
28+
override fun getMetaClass(): MetaClass? {
29+
if (metaClass == null) {
30+
metaClass = InvokerHelper.getMetaClass(javaClass)
31+
}
32+
return metaClass
33+
}
3434

35-
override fun setMetaClass(newMetaClass: MetaClass?) {
36-
metaClass = newMetaClass
37-
}
35+
override fun setMetaClass(newMetaClass: MetaClass?) {
36+
metaClass = newMetaClass
37+
}
3838

39-
@Internal
40-
override fun getArgumentProviders(): MutableList<CommandLineArgumentProvider>? {
41-
return super.getArgumentProviders()
42-
}
39+
@Internal
40+
override fun getArgumentProviders(): MutableList<CommandLineArgumentProvider>? {
41+
return super.getArgumentProviders()
42+
}
4343
}

Diff for: src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiExtension.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import org.gradle.api.provider.Property
77
import javax.inject.Inject
88

99
open class OpenApiExtension @Inject constructor(project: Project) {
10-
val apiDocsUrl: Property<String> = project.objects.property(String::class.java)
11-
val outputFileName: Property<String> = project.objects.property(String::class.java)
12-
val outputDir: DirectoryProperty = project.objects.directoryProperty()
13-
val waitTimeInSeconds: Property<Int> = project.objects.property(Int::class.java)
14-
val forkProperties: Property<Any> = project.objects.property(Any::class.java)
15-
val groupedApiMappings: MapProperty<String, String> = project.objects.mapProperty(String::class.java, String::class.java)
10+
val apiDocsUrl: Property<String> = project.objects.property(String::class.java)
11+
val outputFileName: Property<String> = project.objects.property(String::class.java)
12+
val outputDir: DirectoryProperty = project.objects.directoryProperty()
13+
val waitTimeInSeconds: Property<Int> = project.objects.property(Int::class.java)
14+
val forkProperties: Property<Any> = project.objects.property(Any::class.java)
15+
val groupedApiMappings: MapProperty<String, String> =
16+
project.objects.mapProperty(String::class.java, String::class.java)
1617
}

Diff for: src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGeneratorTask.kt

+77-60
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import com.google.gson.JsonObject
55
import khttp.responses.Response
66
import org.awaitility.Durations
77
import org.awaitility.core.ConditionTimeoutException
8-
import org.awaitility.kotlin.*
8+
import org.awaitility.kotlin.atMost
9+
import org.awaitility.kotlin.await
10+
import org.awaitility.kotlin.ignoreException
11+
import org.awaitility.kotlin.until
12+
import org.awaitility.kotlin.withPollInterval
913
import org.gradle.api.DefaultTask
1014
import org.gradle.api.GradleException
1115
import org.gradle.api.file.DirectoryProperty
@@ -20,71 +24,84 @@ import java.time.temporal.ChronoUnit.SECONDS
2024

2125

2226
open class OpenApiGeneratorTask : DefaultTask() {
23-
@get:Input
24-
val apiDocsUrl: Property<String> = project.objects.property(String::class.java)
25-
@get:Input
26-
val outputFileName: Property<String> = project.objects.property(String::class.java)
27-
@get:Input
28-
val groupedApiMappings: MapProperty<String, String> = project.objects.mapProperty(String::class.java, String::class.java)
29-
@get:OutputDirectory
30-
val outputDir: DirectoryProperty = project.objects.directoryProperty()
31-
private val waitTimeInSeconds: Property<Int> = project.objects.property(Int::class.java)
27+
@get:Input
28+
val apiDocsUrl: Property<String> = project.objects.property(String::class.java)
3229

33-
init {
34-
description = OPEN_API_TASK_DESCRIPTION
35-
group = GROUP_NAME
36-
// load my extensions
37-
val extension: OpenApiExtension = project.extensions.run {
38-
getByName(EXTENSION_NAME) as OpenApiExtension
39-
}
30+
@get:Input
31+
val outputFileName: Property<String> = project.objects.property(String::class.java)
4032

41-
// set a default value if not provided
42-
val defaultOutputDir = project.objects.directoryProperty()
43-
defaultOutputDir.set(project.buildDir)
33+
@get:Input
34+
val groupedApiMappings: MapProperty<String, String> =
35+
project.objects.mapProperty(String::class.java, String::class.java)
4436

45-
apiDocsUrl.set(extension.apiDocsUrl.getOrElse(DEFAULT_API_DOCS_URL))
46-
outputFileName.set(extension.outputFileName.getOrElse(DEFAULT_OPEN_API_FILE_NAME))
47-
groupedApiMappings.set(extension.groupedApiMappings.getOrElse(emptyMap()))
48-
outputDir.set(extension.outputDir.getOrElse(defaultOutputDir.get()))
49-
waitTimeInSeconds.set(extension.waitTimeInSeconds.getOrElse(DEFAULT_WAIT_TIME_IN_SECONDS))
50-
}
37+
@get:OutputDirectory
38+
val outputDir: DirectoryProperty = project.objects.directoryProperty()
39+
private val waitTimeInSeconds: Property<Int> =
40+
project.objects.property(Int::class.java)
5141

52-
@TaskAction
53-
fun execute() {
54-
if (groupedApiMappings.isPresent && groupedApiMappings.get().isNotEmpty()) {
55-
groupedApiMappings.get().forEach(this::generateApiDocs)
56-
} else {
57-
generateApiDocs(apiDocsUrl.get(), outputFileName.get())
58-
}
59-
}
42+
init {
43+
description = OPEN_API_TASK_DESCRIPTION
44+
group = GROUP_NAME
45+
// load my extensions
46+
val extension: OpenApiExtension = project.extensions.run {
47+
getByName(EXTENSION_NAME) as OpenApiExtension
48+
}
6049

61-
fun generateApiDocs(url: String, fileName: String) {
62-
try {
63-
await ignoreException ConnectException::class withPollInterval Durations.ONE_SECOND atMost Duration.of(
64-
waitTimeInSeconds.get().toLong(),
65-
SECONDS
66-
) until {
67-
val statusCode = khttp.get(url).statusCode
68-
logger.trace("apiDocsUrl = {} status code = {}", url, statusCode)
69-
statusCode < 299
70-
}
71-
logger.info("Generating OpenApi Docs..")
72-
val response: Response = khttp.get(url)
50+
// set a default value if not provided
51+
val defaultOutputDir = project.objects.directoryProperty()
52+
defaultOutputDir.set(project.buildDir)
7353

74-
val isYaml = url.toLowerCase().contains(".yaml")
75-
val apiDocs = if (isYaml) response.text else prettifyJson(response)
54+
apiDocsUrl.set(extension.apiDocsUrl.getOrElse(DEFAULT_API_DOCS_URL))
55+
outputFileName.set(extension.outputFileName.getOrElse(DEFAULT_OPEN_API_FILE_NAME))
56+
groupedApiMappings.set(extension.groupedApiMappings.getOrElse(emptyMap()))
57+
outputDir.set(extension.outputDir.getOrElse(defaultOutputDir.get()))
58+
waitTimeInSeconds.set(
59+
extension.waitTimeInSeconds.getOrElse(
60+
DEFAULT_WAIT_TIME_IN_SECONDS
61+
)
62+
)
63+
}
7664

77-
val outputFile = outputDir.file(fileName).get().asFile
78-
outputFile.writeText(apiDocs)
79-
} catch (e: ConditionTimeoutException) {
80-
this.logger.error("Unable to connect to ${url} waited for ${waitTimeInSeconds.get()} seconds", e)
81-
throw GradleException("Unable to connect to ${url} waited for ${waitTimeInSeconds.get()} seconds")
82-
}
83-
}
65+
@TaskAction
66+
fun execute() {
67+
if (groupedApiMappings.isPresent && groupedApiMappings.get().isNotEmpty()) {
68+
groupedApiMappings.get().forEach(this::generateApiDocs)
69+
} else {
70+
generateApiDocs(apiDocsUrl.get(), outputFileName.get())
71+
}
72+
}
8473

85-
private fun prettifyJson(response: Response): String {
86-
val gson = GsonBuilder().setPrettyPrinting().create();
87-
val googleJsonObject = gson.fromJson(response.jsonObject.toString(), JsonObject::class.java)
88-
return gson.toJson(googleJsonObject)
89-
}
74+
fun generateApiDocs(url: String, fileName: String) {
75+
try {
76+
await ignoreException ConnectException::class withPollInterval Durations.ONE_SECOND atMost Duration.of(
77+
waitTimeInSeconds.get().toLong(),
78+
SECONDS
79+
) until {
80+
val statusCode = khttp.get(url).statusCode
81+
logger.trace("apiDocsUrl = {} status code = {}", url, statusCode)
82+
statusCode < 299
83+
}
84+
logger.info("Generating OpenApi Docs..")
85+
val response: Response = khttp.get(url)
86+
87+
val isYaml = url.toLowerCase().contains(".yaml")
88+
val apiDocs = if (isYaml) response.text else prettifyJson(response)
89+
90+
val outputFile = outputDir.file(fileName).get().asFile
91+
outputFile.writeText(apiDocs)
92+
} catch (e: ConditionTimeoutException) {
93+
this.logger.error(
94+
"Unable to connect to ${url} waited for ${waitTimeInSeconds.get()} seconds",
95+
e
96+
)
97+
throw GradleException("Unable to connect to ${url} waited for ${waitTimeInSeconds.get()} seconds")
98+
}
99+
}
100+
101+
private fun prettifyJson(response: Response): String {
102+
val gson = GsonBuilder().setPrettyPrinting().create()
103+
val googleJsonObject =
104+
gson.fromJson(response.jsonObject.toString(), JsonObject::class.java)
105+
return gson.toJson(googleJsonObject)
106+
}
90107
}

Diff for: src/main/kotlin/org/springdoc/openapi/gradle/plugin/OpenApiGradlePlugin.kt

+32-24
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package org.springdoc.openapi.gradle.plugin
33
import org.gradle.api.Plugin
44
import org.gradle.api.Project
55
import org.gradle.api.logging.Logging
6+
import org.gradle.api.provider.Property
67
import java.util.*
78

89
open class OpenApiGradlePlugin : Plugin<Project> {
9-
private val LOGGER =
10-
Logging.getLogger(OpenApiGradlePlugin::class.java)
10+
private val logger = Logging.getLogger(OpenApiGradlePlugin::class.java)
1111

1212
override fun apply(project: Project) {
1313
// Run time dependency on the following plugins
@@ -25,47 +25,55 @@ open class OpenApiGradlePlugin : Plugin<Project> {
2525
}
2626

2727
// Create a forked version spring boot run task
28-
val forkedSpringBoot = project.tasks.register(FORKED_SPRING_BOOT_RUN_TASK_NAME, AnnotatedFork::class.java) { fork ->
28+
val forkedSpringBoot = project.tasks.register(
29+
FORKED_SPRING_BOOT_RUN_TASK_NAME,
30+
AnnotatedFork::class.java
31+
) { fork ->
2932
fork.dependsOn(bootJarTask)
3033

3134
fork.onlyIf {
3235
val bootJar = bootJarTask.get().outputs.files.first()
33-
34-
val command = mutableListOf("java", "-jar")
35-
if (extension.forkProperties.isPresent) {
36-
val element = extension.forkProperties.get()
37-
if (element is String) {
38-
val elements = element
39-
.split("-D")
40-
.filter { s -> s.isNotEmpty() }
41-
.map { "-D${it.trim()}" }
42-
command.addAll(elements)
43-
} else if (element is Properties) {
44-
element.toMap().map { r -> "-D${r.key}=${r.value}" }.forEach { p -> command.add(p) }
45-
} else {
46-
LOGGER.warn("Failed to use the value set for 'forkProprerties'. Only String and Properties objects are supported.")
47-
}
48-
}
49-
command.add("$bootJar")
50-
51-
fork.commandLine = command
36+
fork.commandLine = listOf(
37+
"java",
38+
"-jar"
39+
) + extractProperties(extension.forkProperties) + listOf("$bootJar")
5240
true
5341
}
5442
}
5543

5644
val stopForkedSpringBoot = project.tasks.register(FINALIZER_TASK_NAME) {
5745
it.dependsOn(forkedSpringBoot)
5846
it.doLast {
59-
forkedSpringBoot.get().processHandle.abort();
47+
forkedSpringBoot.get().processHandle.abort()
6048
}
6149
}
6250

6351
// This is my task. Before I can run it I have to run the dependent tasks
64-
project.tasks.register(OPEN__API_TASK_NAME, OpenApiGeneratorTask::class.java) { openApiGenTask ->
52+
project.tasks.register(
53+
OPEN__API_TASK_NAME,
54+
OpenApiGeneratorTask::class.java
55+
) { openApiGenTask ->
6556
openApiGenTask.dependsOn(forkedSpringBoot)
6657
openApiGenTask.finalizedBy(stopForkedSpringBoot)
6758
}
6859
}
6960

7061
}
62+
63+
private fun extractProperties(forkProperties: Property<Any>) =
64+
if (forkProperties.isPresent) {
65+
when (val element = forkProperties.get()) {
66+
is String ->
67+
element.split("-D")
68+
.filter { it.isNotEmpty() }
69+
.map { "-D${it.trim()}" }
70+
is Properties ->
71+
element
72+
.map { "-D${it.key}=${it.value}" }
73+
else -> {
74+
logger.warn("Failed to use the value set for 'forkProperties'. Only String and Properties objects are supported.")
75+
emptyList()
76+
}
77+
}
78+
} else emptyList()
7179
}

0 commit comments

Comments
 (0)