Skip to content

Commit 1dde3c4

Browse files
authored
Merge pull request #5 from kpramesh2212/master
Fix: Add clear error message and terminate spring boot application pr…
2 parents 420b63b + 41c90d0 commit 1dde3c4

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)