Skip to content

Commit 7073dc6

Browse files
committed
generate allOf class
1 parent 0cf36b1 commit 7073dc6

9 files changed

Lines changed: 70 additions & 27 deletions

File tree

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/model/Api.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.openapiprocessor.core.model
1818

1919
import io.openapiprocessor.core.model.datatypes.DataType
20+
import io.openapiprocessor.core.model.datatypes.ModelDataType
2021
import io.openapiprocessor.core.model.datatypes.ObjectDataType
2122
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
2223
import java.util.function.Consumer
@@ -60,6 +61,10 @@ class Api(
6061
models.getObjectDataTypes().forEach(action)
6162
}
6263

64+
fun forEachModelDataType(action: Consumer<ModelDataType>) {
65+
models.getModelDataTypes().forEach(action)
66+
}
67+
6368
fun forEachEnumDataType(action: Consumer<StringEnumDataType>) {
6469
models.getEnumDataTypes().forEach(action)
6570
}

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/model/DataTypes.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616

1717
package io.openapiprocessor.core.model
1818

19-
import io.openapiprocessor.core.model.datatypes.DataType
20-
import io.openapiprocessor.core.model.datatypes.MappedDataType
21-
import io.openapiprocessor.core.model.datatypes.ObjectDataType
22-
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
19+
import io.openapiprocessor.core.model.datatypes.*
2320

2421
/**
2522
* Container of data types from OpenAPI '#/component/schemas'.
@@ -52,6 +49,21 @@ class DataTypes {
5249
.toList()
5350
}
5451

52+
/**
53+
* provides the *object* data types (model classes) used by the api endpoints.
54+
* For this objects the processor will create POJOs classes.
55+
*
56+
* experimental: will probably replace getObjectDataTypes().
57+
*
58+
* @return list of object data types
59+
*/
60+
fun getModelDataTypes(): Collection<ModelDataType> {
61+
return types.values
62+
.filterIsInstance<ModelDataType>()
63+
.filter { it.isModel() }
64+
.toList()
65+
}
66+
5567
/**
5668
* provides the enum data types (model classes) used by the api endpoints.
5769
* For this objects the processor will create enum classes.

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/model/datatypes/ComposedObjectDataType.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ComposedObjectDataType(
3030
constraints: DataTypeConstraints? = null,
3131
deprecated: Boolean = false
3232

33-
): DataTypeBase(constraints, deprecated) {
33+
): DataTypeBase(constraints, deprecated), ModelDataType {
3434

3535
override fun getName(): String {
3636
return type
@@ -51,17 +51,22 @@ class ComposedObjectDataType(
5151
.toSet()
5252
}
5353

54+
// todo find better name
5455
override fun isComposed(): Boolean {
5556
return of != "allOf"
5657
}
5758

58-
fun getProperties(): Map<String, DataType> {
59+
override fun isModel(): Boolean {
60+
return of == "allOf"
61+
}
62+
63+
override fun getProperties(): Map<String, DataType> {
5964
val properties = linkedMapOf<String, DataType>()
6065

6166
if (of == "allOf") {
6267
items.forEach {
6368
if (it is ObjectDataType) {
64-
properties.putAll(it.getObjectProperties())
69+
properties.putAll(it.getProperties())
6570
}
6671
}
6772
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright © 2020 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.model.datatypes
7+
8+
interface ModelDataType: DataType {
9+
10+
fun isModel(): Boolean
11+
12+
fun getProperties(): Map<String, DataType>
13+
14+
}

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/model/datatypes/ObjectDataType.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ObjectDataType(
3030
constraints: DataTypeConstraints? = null,
3131
deprecated: Boolean = false
3232

33-
): DataTypeBase(constraints, deprecated) {
33+
): DataTypeBase(constraints, deprecated), ModelDataType {
3434

3535
override fun getName(): String {
3636
return type
@@ -55,7 +55,16 @@ class ObjectDataType(
5555
return properties[name]!!
5656
}
5757

58+
@Deprecated("do not override groovys getProperties()", ReplaceWith("getProperties()"))
5859
fun getObjectProperties(): Map<String, DataType> {
60+
return getProperties()
61+
}
62+
63+
override fun isModel(): Boolean {
64+
return true
65+
}
66+
67+
override fun getProperties(): Map<String, DataType> {
5968
return properties
6069
}
6170

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import com.google.googlejavaformat.java.JavaFormatterOptions
2121
import io.openapiprocessor.core.converter.ApiOptions
2222
import io.openapiprocessor.core.model.Api
2323
import io.openapiprocessor.core.model.Interface
24-
import io.openapiprocessor.core.model.datatypes.ObjectDataType
2524
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
2625
import io.openapiprocessor.core.misc.toURL
26+
import io.openapiprocessor.core.model.datatypes.ModelDataType
2727
import java.io.BufferedWriter
2828
import java.io.StringWriter
2929
import java.io.Writer
@@ -73,7 +73,7 @@ class ApiWriter(
7373
}
7474

7575
private fun writeObjectDataTypes(api: Api) {
76-
api.forEachObjectDataType {
76+
api.forEachModelDataType {
7777
val target = modelFolder.resolve ("${it.getName()}.java")
7878
val writer = BufferedWriter(PathWriter(target))
7979
writeDataType(writer, it)
@@ -96,7 +96,7 @@ class ApiWriter(
9696
writer.write(format(raw.toString()))
9797
}
9898

99-
private fun writeDataType(writer: Writer, dataType: ObjectDataType) {
99+
private fun writeDataType(writer: Writer, dataType: ModelDataType) {
100100
val raw = StringWriter()
101101
dataTypeWriter.write(raw, dataType)
102102
writer.write(format(raw.toString ()))

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package io.openapiprocessor.core.writer.java
1818

1919
import io.openapiprocessor.core.converter.ApiOptions
2020
import io.openapiprocessor.core.model.datatypes.DataType
21-
import io.openapiprocessor.core.model.datatypes.ObjectDataType
21+
import io.openapiprocessor.core.model.datatypes.ModelDataType
2222
import java.io.Writer
2323

2424
/**
@@ -33,7 +33,7 @@ class DataTypeWriter(
3333
private val validationAnnotations: BeanValidationFactory = BeanValidationFactory()
3434
) {
3535

36-
fun write(target: Writer, dataType: ObjectDataType) {
36+
fun write(target: Writer, dataType: ModelDataType) {
3737
headerWriter.write(target)
3838
target.write("package ${dataType.getPackageName()};\n\n")
3939

@@ -52,16 +52,14 @@ class DataTypeWriter(
5252

5353
target.write("public class ${dataType.getName()} {\n\n")
5454

55-
val propertyNames = dataType.getObjectProperties().keys
56-
propertyNames.forEach {
57-
val javaPropertyName = toCamelCase(it)
58-
val propDataType = dataType.getObjectProperty(it)
59-
target.write(getProp(it, javaPropertyName, propDataType))
55+
val properties = dataType.getProperties()
56+
properties.forEach { (propName, propDataType) ->
57+
val javaPropertyName = toCamelCase(propName)
58+
target.write(getProp(propName, javaPropertyName, propDataType))
6059
}
6160

62-
propertyNames.forEach {
63-
val javaPropertyName = toCamelCase(it)
64-
val propDataType = dataType.getObjectProperty(it)
61+
properties.forEach { (propName, propDataType) ->
62+
val javaPropertyName = toCamelCase(propName)
6563
target.write(getGetter(javaPropertyName, propDataType))
6664
target.write(getSetter(javaPropertyName, propDataType))
6765
}
@@ -122,14 +120,14 @@ class DataTypeWriter(
122120
return result
123121
}
124122

125-
private fun collectImports(packageName: String, dataType: ObjectDataType): List<String> {
123+
private fun collectImports(packageName: String, dataType: ModelDataType): List<String> {
126124
val imports = mutableSetOf<String>()
127125
imports.add("com.fasterxml.jackson.annotation.JsonProperty")
128126

129127
imports.addAll(dataType.getReferencedImports())
130128

131129
if (apiOptions.beanValidation) {
132-
dataType.getObjectProperties().values.forEach {
130+
dataType.getProperties().values.forEach {
133131
imports.addAll(validationAnnotations.collectImports(it))
134132
}
135133
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ class ApiWriterSpec: StringSpec({
218218
"re-formats model sources" {
219219
val dtWriter = io.mockk.mockk<DataTypeWriter>()
220220
every { dtWriter.write(any(), any()) } answers {
221-
arg<Writer>(0).write(" class \n ${arg<ObjectDataType>(1).getName()} { }\n")
221+
arg<Writer>(0).write(" class \n ${arg<ModelDataType>(1).getName()} { }\n")
222222
}
223223

224224
val dt = DataTypes()

openapi-processor-core/src/testInt/groovy/com/github/hauner/openapi/processor/core/ProcessorPendingTest.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ import org.junit.runner.RunWith
2525
import org.junit.runners.Parameterized
2626
import spock.lang.Ignore
2727

28-
@Ignore
28+
//@Ignore
2929
@RunWith(Parameterized)
3030
class ProcessorPendingTest extends ProcessorTestBase {
3131

3232
@Parameterized.Parameters(name = "{0}")
3333
static Collection<TestSet> sources () {
3434
return [
35-
new TestSet(name: 'ref-loop-array', processor: new TestProcessor(), parser: ParserType.SWAGGER),
36-
new TestSet(name: 'ref-loop-array', processor: new TestProcessor(), parser: ParserType.OPENAPI4J)
35+
new TestSet(name: 'schema-composed-allof', processor: new TestProcessor(), parser: ParserType.SWAGGER),
36+
new TestSet(name: 'schema-composed-allof', processor: new TestProcessor(), parser: ParserType.OPENAPI4J)
3737
]
3838
}
3939

0 commit comments

Comments
 (0)