Skip to content

Commit b90bde7

Browse files
committed
GH-95 Add error location to the missing mime type warning (Resolve #95)
1 parent 0360f54 commit b90bde7

File tree

4 files changed

+34
-15
lines changed

4 files changed

+34
-15
lines changed

examples/javalin-gradle-kotlin/src/main/java/io/javalin/openapi/plugin/test/JavalinTest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,16 @@
2424
import io.javalin.openapi.OpenApiContentProperty;
2525
import io.javalin.openapi.OpenApiExample;
2626
import io.javalin.openapi.OpenApiIgnore;
27-
import io.javalin.openapi.OpenApiInfo;
2827
import io.javalin.openapi.OpenApiLicense;
2928
import io.javalin.openapi.OpenApiName;
3029
import io.javalin.openapi.OpenApiParam;
3130
import io.javalin.openapi.OpenApiPropertyType;
3231
import io.javalin.openapi.OpenApiRequestBody;
3332
import io.javalin.openapi.OpenApiResponse;
3433
import io.javalin.openapi.OpenApiSecurity;
35-
import io.javalin.openapi.OpenApiServer;
36-
import io.javalin.openapi.OpenApiServerVariable;
3734
import io.javalin.openapi.OpenID;
3835
import io.javalin.openapi.Security;
3936
import io.javalin.openapi.Visibility;
40-
import io.javalin.openapi.plugin.DefinitionConfiguration;
4137
import io.javalin.openapi.plugin.OpenApiConfiguration;
4238
import io.javalin.openapi.plugin.OpenApiPlugin;
4339
import io.javalin.openapi.plugin.SecurityConfiguration;
@@ -201,6 +197,7 @@ public static void main(String[] args) {
201197
@OpenApiContent(from = EntityDto[].class), // array
202198
@OpenApiContent(from = File.class), // file
203199
@OpenApiContent(type = "application/json"), // empty
200+
@OpenApiContent(), // empty
204201
@OpenApiContent(mimeType = "image/png", type = "string", format = "base64"), // single file upload,
205202
@OpenApiContent(mimeType = "multipart/form-data", properties = {
206203
@OpenApiContentProperty(name = "form-element", type = "integer"), // random element in form-data

openapi-annotation-processor/src/main/kotlin/io/javalin/openapi/processor/OpenApiAnnotationProcessor.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.javalin.openapi.processor
22

33
import com.google.gson.Gson
44
import com.google.gson.GsonBuilder
5+
import com.sun.source.util.Trees
56
import io.javalin.openapi.JsonSchema
67
import io.javalin.openapi.OpenApi
78
import javax.annotation.processing.AbstractProcessor
@@ -21,13 +22,15 @@ open class OpenApiAnnotationProcessor : AbstractProcessor() {
2122
.setPrettyPrinting()
2223
.create()
2324

25+
lateinit var trees: Trees
2426
lateinit var messager: Messager
2527
lateinit var elements: Elements
2628
lateinit var types: Types
2729
lateinit var filer: Filer
2830
}
2931

3032
override fun init(processingEnv: ProcessingEnvironment) {
33+
trees = Trees.instance(processingEnv)
3134
messager = processingEnv.messager
3235
elements = processingEnv.elementUtils
3336
types = processingEnv.typeUtils

openapi-annotation-processor/src/main/kotlin/io/javalin/openapi/processor/OpenApiGenerator.kt

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.javalin.openapi.OpenApiContent
1111
import io.javalin.openapi.OpenApiParam
1212
import io.javalin.openapi.OpenApis
1313
import io.javalin.openapi.getFormattedPath
14+
import io.javalin.openapi.processor.OpenApiAnnotationProcessor.Companion.trees
1415
import io.javalin.openapi.processor.OpenApiGenerator.In.COOKIE
1516
import io.javalin.openapi.processor.OpenApiGenerator.In.FORM_DATA
1617
import io.javalin.openapi.processor.OpenApiGenerator.In.HEADER
@@ -29,6 +30,7 @@ import io.swagger.v3.parser.OpenAPIV3Parser
2930
import io.swagger.v3.parser.core.models.ParseOptions
3031
import java.util.TreeMap
3132
import javax.annotation.processing.RoundEnvironment
33+
import javax.lang.model.element.Element
3234
import javax.lang.model.type.TypeMirror
3335
import javax.tools.Diagnostic
3436
import javax.tools.Diagnostic.Kind.WARNING
@@ -39,13 +41,18 @@ internal class OpenApiGenerator {
3941

4042
fun generate(roundEnvironment: RoundEnvironment) {
4143
val aggregatedOpenApiAnnotations = roundEnvironment.getElementsAnnotatedWith(OpenApis::class.java)
42-
.flatMap { it.getAnnotation(OpenApis::class.java).value.asSequence() }
44+
.flatMap { element ->
45+
element.getAnnotation(OpenApis::class.java)
46+
.value
47+
.asSequence()
48+
.map { element to it }
49+
}
4350

4451
val standaloneOpenApiAnnotations = roundEnvironment.getElementsAnnotatedWith(OpenApi::class.java)
45-
.map { it.getAnnotation(OpenApi::class.java) }
52+
.map { it to it.getAnnotation(OpenApi::class.java) }
4653

4754
val openApiAnnotationsByVersion = (aggregatedOpenApiAnnotations + standaloneOpenApiAnnotations)
48-
.flatMap { it.versions.map { version -> version to it } }
55+
.flatMap { it.second.versions.map { version -> version to it } }
4956
.groupBy { (version, _) -> version }
5057
.mapValues { (_, annotations) -> annotations.map { it.second } }
5158

@@ -82,7 +89,7 @@ internal class OpenApiGenerator {
8289
* @param openApiAnnotations annotation instances to map
8390
* @return OpenApi JSON response
8491
*/
85-
private fun generateSchema(openApiAnnotations: Collection<OpenApi>): String {
92+
private fun generateSchema(openApiAnnotations: Collection<Pair<Element, OpenApi>>): String {
8693
val openApi = JsonObject()
8794
openApi.addProperty("openapi", "3.0.3")
8895

@@ -96,7 +103,7 @@ internal class OpenApiGenerator {
96103
val paths = JsonObject()
97104
openApi.add("paths", paths)
98105

99-
for (routeAnnotation in openApiAnnotations.sortedBy { it.getFormattedPath() }) {
106+
for ((openApiElement, routeAnnotation) in openApiAnnotations.sortedBy { it.second.getFormattedPath() }) {
100107
if (routeAnnotation.ignore) {
101108
continue
102109
}
@@ -146,7 +153,7 @@ internal class OpenApiGenerator {
146153
val requestBodyAnnotation = routeAnnotation.requestBody
147154
val requestBody = JsonObject()
148155
requestBody.addString("description", requestBodyAnnotation.description)
149-
requestBody.addContent(requestBodyAnnotation.content)
156+
requestBody.addContent(openApiElement, requestBodyAnnotation.content)
150157
if (requestBody.size() > 0) {
151158
operation.add("requestBody", requestBody)
152159
}
@@ -166,7 +173,7 @@ internal class OpenApiGenerator {
166173
?.let { HttpStatus.forStatus(it) }?.message
167174

168175
response.addString("description", description)
169-
response.addContent(responseAnnotation.content)
176+
response.addContent(openApiElement, responseAnnotation.content)
170177
responses.add(responseAnnotation.status, response)
171178
}
172179

@@ -263,7 +270,7 @@ internal class OpenApiGenerator {
263270
return parameter
264271
}
265272

266-
private fun JsonObject.addContent(contentAnnotations: Array<OpenApiContent>) {
273+
private fun JsonObject.addContent(element: Element, contentAnnotations: Array<OpenApiContent>) {
267274
val requestBodyContent = JsonObject()
268275
val requestBodySchemes = TreeMap<String, JsonObject>()
269276

@@ -287,7 +294,21 @@ internal class OpenApiGenerator {
287294
}
288295

289296
if (mimeType == null) {
290-
OpenApiAnnotationProcessor.messager.printMessage(WARNING, "Cannot add $contentAnnotation, OpenApi generator cannot find matching mime type")
297+
val compilationUnit = trees.getPath(element).compilationUnit
298+
val tree = trees.getTree(element)
299+
val startPosition = trees.sourcePositions.getStartPosition(compilationUnit, tree)
300+
301+
OpenApiAnnotationProcessor.messager.printMessage(
302+
WARNING,
303+
"""
304+
OpenApi generator cannot find matching mime type defined.
305+
Source:
306+
Annotation in ${compilationUnit.lineMap.getLineNumber(startPosition)} at ${compilationUnit.sourceFile.name} line
307+
Annotation:
308+
$contentAnnotation
309+
""".trimIndent()
310+
)
311+
291312
continue
292313
}
293314

openapi-annotation-processor/src/main/kotlin/io/javalin/openapi/processor/shared/JsonTypes.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package io.javalin.openapi.processor.shared
22

33
import io.javalin.openapi.processor.OpenApiAnnotationProcessor
4-
import io.javalin.openapi.processor.shared.JsonTypes.DataModel
5-
import io.javalin.openapi.processor.shared.JsonTypes.DataType
64
import io.javalin.openapi.processor.shared.JsonTypes.DataType.ARRAY
75
import io.javalin.openapi.processor.shared.JsonTypes.DataType.DEFAULT
86
import io.javalin.openapi.processor.shared.JsonTypes.DataType.DICTIONARY

0 commit comments

Comments
 (0)