Skip to content

Commit 41c90d0

Browse files
author
Ramesh KP
committed
Fix: Add clear error message and terminate spring boot application properly after error
This fix includes the following Add support for clear error message After an error shutdown the spring boot application properly Updates to Readme Add support for publishing the plugin to gradle plugin portal.
1 parent 5d31639 commit 41c90d0

File tree

5 files changed

+40
-16
lines changed

5 files changed

+40
-16
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
#**Introduction to springdoc-openapi-gradle-plugin**
1+
# **Introduction to springdoc-openapi-gradle-plugin**
2+
23
Spring Docs Open API Gradle Plugin - Generates OpenAPI-3 specification docs for spring boot application
34

45
This Gradle plugin provides the capability to generate OpenAPI-3 specification docs for spring boot application from a Gradle build.
@@ -84,7 +85,7 @@ Parameter | Description | Required | Default
8485
`apiDocsUrl` | The url from where the open api docs can be downloaded | No | http://localhost:8080/v3/api-docs
8586
`outputDir` | The output directory where the generated open api file would be placed | No | $buildDir - Your projects build dir
8687
`outputFileName` | The name of the output file with extension | No | openapi.json
87-
`waitTimeInSeconds` | Time to wait in seconds for your spring boot application to start, before we make calls to `apiDocsUrl` to download the openapi docs | No | 10 seconds
88+
`waitTimeInSeconds` | Time to wait in seconds for your spring boot application to start, before we make calls to `apiDocsUrl` to download the openapi docs | No | 30 seconds
8889

8990
# Building the plugin
9091

build.gradle.kts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
plugins {
22
`java-gradle-plugin`
3+
id("com.gradle.plugin-publish") version "0.10.1"
34
kotlin("jvm") version "1.3.61"
45
`maven-publish`
56
}
67

78
group = "org.springdoc"
8-
version = "1.0-SNAPSHOT"
9+
version = "0.0.1-BETA"
910

1011
repositories {
1112
mavenCentral()
@@ -32,19 +33,27 @@ dependencies {
3233
implementation(kotlin("reflect"))
3334
implementation(group = "khttp", name = "khttp", version = "1.0.0")
3435
implementation(group = "com.google.code.gson", name = "gson", version = "2.8.6")
35-
implementation(group = "com.jayway.awaitility", name = "awaitility", version = "1.7.0")
36+
implementation(group = "org.awaitility", name = "awaitility-kotlin", version = "4.0.2")
3637
implementation(files("/home/ramesh/gradle-processes/build/libs/gradle-processes-0.5.0.jar"))
3738
}
3839

3940
gradlePlugin {
4041
plugins {
4142
create("springdoc-gradle-plugin") {
4243
id = "org.springdoc.openapi-gradle-plugin"
44+
displayName = "Spring Docs OpenApi Gradle plugin"
45+
description = " This plugin generates json OpenAPI description during build time"
4346
implementationClass = "org.springdoc.openapi.gradle.plugin.OpenApiGradlePlugin"
4447
}
4548
}
4649
}
4750

51+
pluginBundle {
52+
website = "https://github.com/springdoc/springdoc-openapi-gradle-plugin"
53+
vcsUrl = "https://github.com/springdoc/springdoc-openapi-gradle-plugin.git"
54+
tags = listOf("SpringDocs", "OpenApi", "SwaggerDocs")
55+
}
56+
4857
tasks {
4958
compileKotlin {
5059
kotlinOptions.jvmTarget = "1.8"

src/main/kotlin/org/springdoc/openapi/gradle/plugin/Constants.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const val FORKED_SPRING_BOOT_RUN_TASK_NAME = "forkedSpringBootRun"
99

1010
const val DEFAULT_API_DOCS_URL = "http://localhost:8080/v3/api-docs"
1111
const val DEFAULT_OPEN_API_FILE_NAME = "openapi.json"
12-
const val DEFAULT_WAIT_TIME_IN_SECONDS = 10
12+
const val DEFAULT_WAIT_TIME_IN_SECONDS = 30
1313

1414
const val SPRING_BOOT_PLUGIN = "org.springframework.boot"
1515
const val PROCESS_PLUGIN = "com.github.johnrengelman.processes"

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,30 @@ package org.springdoc.openapi.gradle.plugin
22

33
import com.google.gson.GsonBuilder
44
import com.google.gson.JsonObject
5-
import com.jayway.awaitility.core.ConditionTimeoutException
65
import khttp.responses.Response
6+
import org.awaitility.Durations
7+
import org.awaitility.core.ConditionTimeoutException
8+
import org.awaitility.kotlin.*
79
import org.gradle.api.DefaultTask
8-
import org.gradle.api.GradleException
910
import org.gradle.api.file.DirectoryProperty
1011
import org.gradle.api.provider.Property
1112
import org.gradle.api.tasks.Input
1213
import org.gradle.api.tasks.OutputDirectory
1314
import org.gradle.api.tasks.TaskAction
14-
import org.slf4j.LoggerFactory
15+
import java.net.ConnectException
16+
import java.time.Duration
17+
import java.time.temporal.ChronoUnit.SECONDS
18+
1519

1620
open class OpenApiGeneratorTask: DefaultTask() {
17-
private val LOGGER = LoggerFactory.getLogger(OpenApiGeneratorTask::class.java)
1821
@get:Input
1922
val apiDocsUrl: Property<String> = project.objects.property(String::class.java)
2023
@get:Input
2124
val outputFileName: Property<String> = project.objects.property(String::class.java)
2225
@get:OutputDirectory
2326
val outputDir: DirectoryProperty = project.objects.directoryProperty()
2427
private val waitTimeInSeconds: Property<Int> = project.objects.property(Int::class.java)
28+
val taskError: Property<String> = project.objects.property(String::class.java)
2529

2630
init {
2731
description = OPEN_API_TASK_DESCRIPTION
@@ -35,6 +39,7 @@ open class OpenApiGeneratorTask: DefaultTask() {
3539
val defaultOutputDir = project.objects.directoryProperty()
3640
defaultOutputDir.set(project.buildDir)
3741

42+
taskError.set("")
3843
apiDocsUrl.set(extension.apiDocsUrl.getOrElse(DEFAULT_API_DOCS_URL))
3944
outputFileName.set(extension.outputFileName.getOrElse(DEFAULT_OPEN_API_FILE_NAME))
4045
outputDir.set(extension.outputDir.getOrElse(defaultOutputDir.get()))
@@ -44,17 +49,21 @@ open class OpenApiGeneratorTask: DefaultTask() {
4449
@TaskAction
4550
fun execute() {
4651
try {
47-
// I need to change this later on to use a smart logic to wait only for required time
48-
Thread.sleep(waitTimeInSeconds.get().toLong() * 1000)
52+
await ignoreException ConnectException::class withPollInterval Durations.ONE_SECOND atMost Duration.of(waitTimeInSeconds.get().toLong(), SECONDS) until {
53+
val statusCode = khttp.get(apiDocsUrl.get()).statusCode
54+
logger.trace("apiDocsUrl = {} status code = {}", apiDocsUrl.get(), statusCode)
55+
statusCode < 299
56+
}
57+
logger.info("Generating OpenApi Docs..")
4958
val response: Response = khttp.get(apiDocsUrl.get())
5059
val gson = GsonBuilder().setPrettyPrinting().create();
5160
val googleJsonObject = gson.fromJson(response.jsonObject.toString(), JsonObject::class.java)
5261

5362
val outputFile = outputDir.file(outputFileName.get()).get().asFile
5463
outputFile.writeText(gson.toJson(googleJsonObject))
5564
} catch (e: ConditionTimeoutException) {
56-
LOGGER.error("Unable to connect to ${apiDocsUrl.get()} waited for ${waitTimeInSeconds.get()} seconds")
57-
throw GradleException("Timeout occurred while trying to connect to ${apiDocsUrl.get()}")
65+
taskError.set("Timeout occurred while trying to connect to ${apiDocsUrl.get()}")
66+
this.logger.error("Unable to connect to ${apiDocsUrl.get()} waited for ${waitTimeInSeconds.get()} seconds", e)
5867
}
5968
}
6069

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.springdoc.openapi.gradle.plugin
22

33
import com.github.jengelman.gradle.plugins.processes.tasks.Fork
4+
import org.gradle.api.GradleException
45
import org.gradle.api.Plugin
56
import org.gradle.api.Project
67
import org.slf4j.LoggerFactory
@@ -31,10 +32,14 @@ open class OpenApiGradlePlugin: Plugin<Project> {
3132
}
3233

3334
// This is my task. Before I can run it I have to run the dependent tasks
34-
val openApiGeneratorTask = project.tasks.register(OPEN__API_TASK_NAME, OpenApiGeneratorTask::class.java) {
35-
it.dependsOn(forkedSpringBoot)
36-
it.doLast {
35+
val openApiGeneratorTask = project.tasks.register(OPEN__API_TASK_NAME, OpenApiGeneratorTask::class.java) { openApiGenTask ->
36+
openApiGenTask.dependsOn(forkedSpringBoot)
37+
38+
openApiGenTask.doLast {
3739
forkedSpringBoot.get().processHandle.abort()
40+
if (openApiGenTask.taskError.get().isNotBlank()) {
41+
throw GradleException(openApiGenTask.taskError.get())
42+
}
3843
}
3944
}
4045
}

0 commit comments

Comments
 (0)