Skip to content

Commit afa66ad

Browse files
committed
#30, support "object @ io.oap.Annotation" mapping
1 parent bc50fdd commit afa66ad

4 files changed

Lines changed: 72 additions & 8 deletions

File tree

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/converter/MappingFinder.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import io.openapiprocessor.core.model.HttpMethod
1616
*/
1717
class MappingFinder(private val typeMappings: List<Mapping> = emptyList()) {
1818

19-
fun findTypeAnnotations(typeName: String): List<AnnotationTypeMapping> {
20-
return findTypeAnnotations(typeMappings, typeName)
19+
fun findTypeAnnotations(typeName: String, allowObject: Boolean = false): List<AnnotationTypeMapping> {
20+
return findTypeAnnotations(typeMappings, typeName, allowObject)
2121
}
2222

2323
fun findParameterAnnotations(path: String, method: HttpMethod?, typeName: String)
@@ -53,7 +53,7 @@ class MappingFinder(private val typeMappings: List<Mapping> = emptyList()) {
5353
.flatten()
5454
}
5555

56-
private fun findTypeAnnotations(typeMappings: List<Mapping>, typeName: String)
56+
private fun findTypeAnnotations(typeMappings: List<Mapping>, typeName: String, allowObject: Boolean = false)
5757
: List<AnnotationTypeMapping> {
5858

5959
val (type, format) = splitTypeName(typeName)
@@ -64,7 +64,7 @@ class MappingFinder(private val typeMappings: List<Mapping> = emptyList()) {
6464
val matchType = it.sourceTypeName == type
6565
val matchFormat = it.sourceTypeFormat == format
6666

67-
(matchType && matchFormat) || (matchObject && matchFormat)
67+
(matchType && matchFormat) || (allowObject && matchObject)
6868
}
6969
}
7070

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/writer/java/DataTypeWriterPojo.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class DataTypeWriterPojo(
8282

8383
private fun writeAnnotationsMappings(target: Writer, dataType: ModelDataType) {
8484
val annotationTypeMappings = MappingFinder(apiOptions.typeMappings)
85-
.findTypeAnnotations(dataType.getTypeName())
85+
.findTypeAnnotations(dataType.getTypeName(), true)
8686

8787
annotationTypeMappings.forEach {
8888
annotationWriter.write(target, Annotation(it.annotation.type, it.annotation.parameters))
@@ -273,7 +273,7 @@ class DataTypeWriterPojo(
273273
imports.addAll(dataType.referencedImports)
274274

275275
val annotationTypeMappings = MappingFinder(apiOptions.typeMappings)
276-
.findTypeAnnotations(dataType.getTypeName())
276+
.findTypeAnnotations(dataType.getTypeName(), true)
277277

278278
annotationTypeMappings.forEach {
279279
imports.add(it.annotation.type)

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/converter/MappingFinderAnnotationSpec.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66
package io.openapiprocessor.core.converter
77

88
import io.kotest.core.spec.style.StringSpec
9+
import io.kotest.matchers.collections.shouldBeEmpty
910
import io.kotest.matchers.shouldBe
1011
import io.openapiprocessor.core.converter.mapping.Annotation
1112
import io.openapiprocessor.core.converter.mapping.AnnotationTypeMapping
1213
import io.openapiprocessor.core.converter.mapping.ParameterAnnotationTypeMapping
14+
import io.openapiprocessor.core.model.datatypes.ArrayDataType
15+
import io.openapiprocessor.core.model.datatypes.StringDataType
16+
import io.openapiprocessor.core.support.datatypes.ObjectDataType
17+
import io.openapiprocessor.core.support.datatypes.propertyDataTypeString
1318

1419
class MappingFinderAnnotationSpec: StringSpec({
1520

@@ -26,19 +31,37 @@ class MappingFinderAnnotationSpec: StringSpec({
2631
mapping.first().sourceTypeName shouldBe "Foo"
2732
}
2833

29-
"find 'object' type annotation mapping" {
34+
"find 'object' type annotation mapping for model data type" {
3035
val finder = MappingFinder(listOf(
3136
AnnotationTypeMapping(
3237
"object", null,
3338
Annotation("annotation.Bar"))
3439
))
3540

36-
val mapping = finder.findTypeAnnotations("Foo")
41+
val dataType = ObjectDataType("Foo", "pkg", linkedMapOf(
42+
Pair("foo", propertyDataTypeString())
43+
))
44+
45+
val mapping = finder.findTypeAnnotations(dataType.getTypeName(), true)
3746

3847
mapping.size shouldBe 1
3948
mapping.first().sourceTypeName shouldBe "object"
4049
}
4150

51+
"ignore 'object' type annotation mapping for non model data types" {
52+
val finder = MappingFinder(listOf(
53+
AnnotationTypeMapping(
54+
"object", null,
55+
Annotation("annotation.Bar"))
56+
))
57+
58+
val mappingSimple = finder.findTypeAnnotations(StringDataType().getTypeName())
59+
mappingSimple.shouldBeEmpty()
60+
61+
val mappingCollection = finder.findTypeAnnotations(ArrayDataType(StringDataType()).getTypeName())
62+
mappingCollection.shouldBeEmpty()
63+
}
64+
4265
"find type:format annotation mapping" {
4366
val finder = MappingFinder(listOf(
4467
AnnotationTypeMapping(

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/writer/java/DataTypeWriterPojoSpec.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,45 @@ class DataTypeWriterPojoSpec: StringSpec({
347347
|}
348348
""".trimMargin()
349349
}
350+
351+
"writes additional annotation from 'object' annotation mapping" {
352+
options.typeMappings = listOf(
353+
AnnotationTypeMapping(
354+
"object", annotation = MappingAnnotation("foo.Bar", linkedMapOf())
355+
)
356+
)
357+
358+
writer = DataTypeWriterPojo(options, generatedWriter, BeanValidationFactory())
359+
360+
val dataType = ObjectDataType("Object",
361+
"pkg", linkedMapOf(
362+
"foo" to propertyDataType(ObjectDataType("Foo", "model")))
363+
)
364+
365+
// when:
366+
writer.write(target, dataType)
367+
368+
// then:
369+
target.toString() shouldContain
370+
"""
371+
|@Bar
372+
|@Generated
373+
|public class Object {
374+
|
375+
| @JsonProperty("foo")
376+
| private Foo foo;
377+
|
378+
| public Foo getFoo() {
379+
| return foo;
380+
| }
381+
|
382+
| public void setFoo(Foo foo) {
383+
| this.foo = foo;
384+
| }
385+
|
386+
|}
387+
""".trimMargin()
388+
}
389+
390+
350391
})

0 commit comments

Comments
 (0)