Skip to content
This repository was archived by the owner on Mar 16, 2025. It is now read-only.

#43 #47

Merged
merged 6 commits into from
Dec 3, 2020
Merged

#43 #47

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -203,13 +203,13 @@ class SchemaInfo(
}

/**
* iterate over items
* iterate over composed items
*/
fun eachItemOf(action: (info: SchemaInfo) -> Unit) {
schema?.getItems()?.forEachIndexed { index, schema ->
action(SchemaInfo(
path = path,
name = "${name}-of-${index}",
name = "${name}_${itemOf()!!.capitalize()}_${index}",
schema = schema,
resolver = resolver
))
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/io/openapiprocessor/core/model/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package io.openapiprocessor.core.model

import io.openapiprocessor.core.model.datatypes.DataType
import io.openapiprocessor.core.model.datatypes.ModelDataType
import io.openapiprocessor.core.model.datatypes.ObjectDataType
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
import java.util.function.Consumer
Expand Down Expand Up @@ -60,6 +61,10 @@ class Api(
models.getObjectDataTypes().forEach(action)
}

fun forEachModelDataType(action: Consumer<ModelDataType>) {
models.getModelDataTypes().forEach(action)
}

fun forEachEnumDataType(action: Consumer<StringEnumDataType>) {
models.getEnumDataTypes().forEach(action)
}
Expand Down
20 changes: 16 additions & 4 deletions src/main/kotlin/io/openapiprocessor/core/model/DataTypes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@

package io.openapiprocessor.core.model

import io.openapiprocessor.core.model.datatypes.DataType
import io.openapiprocessor.core.model.datatypes.MappedDataType
import io.openapiprocessor.core.model.datatypes.ObjectDataType
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
import io.openapiprocessor.core.model.datatypes.*

/**
* Container of data types from OpenAPI '#/component/schemas'.
Expand Down Expand Up @@ -52,6 +49,21 @@ class DataTypes {
.toList()
}

/**
* provides the *object* data types (model classes) used by the api endpoints.
* For this objects the processor will create POJOs classes.
*
* experimental: will probably replace getObjectDataTypes().
*
* @return list of object data types
*/
fun getModelDataTypes(): Collection<ModelDataType> {
return types.values
.filterIsInstance<ModelDataType>()
.filter { it.isModel() }
.toList()
}

/**
* provides the enum data types (model classes) used by the api endpoints.
* For this objects the processor will create enum classes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ComposedObjectDataType(
constraints: DataTypeConstraints? = null,
deprecated: Boolean = false

): DataTypeBase(constraints, deprecated) {
): DataTypeBase(constraints, deprecated), ModelDataType {

override fun getName(): String {
return type
Expand All @@ -51,8 +51,27 @@ class ComposedObjectDataType(
.toSet()
}

// todo find better name
override fun isComposed(): Boolean {
return of != "allOf"
}

override fun isModel(): Boolean {
return of == "allOf"
}

override fun getProperties(): Map<String, DataType> {
val properties = linkedMapOf<String, DataType>()

if (of == "allOf") {
items.forEach {
if (it is ObjectDataType) {
properties.putAll(it.getProperties())
}
}
}

return properties
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright © 2020 https://github.com/openapi-processor/openapi-processor-core
* PDX-License-Identifier: Apache-2.0
*/

package io.openapiprocessor.core.model.datatypes

interface ModelDataType: DataType {

fun isModel(): Boolean

fun getProperties(): Map<String, DataType>

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ObjectDataType(
constraints: DataTypeConstraints? = null,
deprecated: Boolean = false

): DataTypeBase(constraints, deprecated) {
): DataTypeBase(constraints, deprecated), ModelDataType {

override fun getName(): String {
return type
Expand All @@ -55,7 +55,16 @@ class ObjectDataType(
return properties[name]!!
}

@Deprecated("do not override groovys getProperties()", ReplaceWith("getProperties()"))
fun getObjectProperties(): Map<String, DataType> {
return getProperties()
}

override fun isModel(): Boolean {
return true
}

override fun getProperties(): Map<String, DataType> {
return properties
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ import com.google.googlejavaformat.java.JavaFormatterOptions
import io.openapiprocessor.core.converter.ApiOptions
import io.openapiprocessor.core.model.Api
import io.openapiprocessor.core.model.Interface
import io.openapiprocessor.core.model.datatypes.ObjectDataType
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
import io.openapiprocessor.core.misc.toURL
import io.openapiprocessor.core.model.datatypes.ModelDataType
import java.io.BufferedWriter
import java.io.StringWriter
import java.io.Writer
Expand Down Expand Up @@ -73,7 +73,7 @@ class ApiWriter(
}

private fun writeObjectDataTypes(api: Api) {
api.forEachObjectDataType {
api.forEachModelDataType {
val target = modelFolder.resolve ("${it.getName()}.java")
val writer = BufferedWriter(PathWriter(target))
writeDataType(writer, it)
Expand All @@ -96,7 +96,7 @@ class ApiWriter(
writer.write(format(raw.toString()))
}

private fun writeDataType(writer: Writer, dataType: ObjectDataType) {
private fun writeDataType(writer: Writer, dataType: ModelDataType) {
val raw = StringWriter()
dataTypeWriter.write(raw, dataType)
writer.write(format(raw.toString ()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package io.openapiprocessor.core.writer.java

import io.openapiprocessor.core.converter.ApiOptions
import io.openapiprocessor.core.model.datatypes.DataType
import io.openapiprocessor.core.model.datatypes.ObjectDataType
import io.openapiprocessor.core.model.datatypes.ModelDataType
import java.io.Writer

/**
Expand All @@ -33,7 +33,7 @@ class DataTypeWriter(
private val validationAnnotations: BeanValidationFactory = BeanValidationFactory()
) {

fun write(target: Writer, dataType: ObjectDataType) {
fun write(target: Writer, dataType: ModelDataType) {
headerWriter.write(target)
target.write("package ${dataType.getPackageName()};\n\n")

Expand All @@ -52,16 +52,14 @@ class DataTypeWriter(

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

val propertyNames = dataType.getObjectProperties().keys
propertyNames.forEach {
val javaPropertyName = toCamelCase(it)
val propDataType = dataType.getObjectProperty(it)
target.write(getProp(it, javaPropertyName, propDataType))
val properties = dataType.getProperties()
properties.forEach { (propName, propDataType) ->
val javaPropertyName = toCamelCase(propName)
target.write(getProp(propName, javaPropertyName, propDataType))
}

propertyNames.forEach {
val javaPropertyName = toCamelCase(it)
val propDataType = dataType.getObjectProperty(it)
properties.forEach { (propName, propDataType) ->
val javaPropertyName = toCamelCase(propName)
target.write(getGetter(javaPropertyName, propDataType))
target.write(getSetter(javaPropertyName, propDataType))
}
Expand Down Expand Up @@ -122,14 +120,14 @@ class DataTypeWriter(
return result
}

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

imports.addAll(dataType.getReferencedImports())

if (apiOptions.beanValidation) {
dataType.getObjectProperties().values.forEach {
dataType.getProperties().values.forEach {
imports.addAll(validationAnnotations.collectImports(it))
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright © 2020 https://github.com/openapi-processor/openapi-processor-core
* PDX-License-Identifier: Apache-2.0
*/

package io.openapiprocessor.core.model.datatypes

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class ComposedObjectDataTypeSpec : StringSpec({

"loop properties of allOf objects as if it was a single object" {
val composed = ComposedObjectDataType("Foo", "pkg", "allOf", listOf(
ObjectDataType("Foo", "pkg", linkedMapOf(
Pair("foo", StringDataType()),
Pair("foobar", StringDataType())
)),
ObjectDataType("Bar", "pkg", linkedMapOf(
Pair("bar", StringDataType()),
Pair("barfoo", StringDataType())
))
))

val properties = composed.getProperties()

properties.keys shouldBe linkedSetOf("foo", "foobar", "bar", "barfoo")
}

})
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ class ApiWriterSpec: StringSpec({
"re-formats model sources" {
val dtWriter = io.mockk.mockk<DataTypeWriter>()
every { dtWriter.write(any(), any()) } answers {
arg<Writer>(0).write(" class \n ${arg<ObjectDataType>(1).getName()} { }\n")
arg<Writer>(0).write(" class \n ${arg<ModelDataType>(1).getName()} { }\n")
}

val dt = DataTypes()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ class ProcessorEndToEndTest extends ProcessorTestBase {
'ref-loop-array',
'ref-parameter',
'ref-parameter-with-primitive-mapping',
'response-content-multiple-no-content'
'response-content-multiple-no-content',
'schema-composed-allof'
]

@Parameterized.Parameters(name = "{0}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ class ProcessorPendingTest extends ProcessorTestBase {
@Parameterized.Parameters(name = "{0}")
static Collection<TestSet> sources () {
return [
new TestSet(name: 'ref-loop-array', processor: new TestProcessor(), parser: ParserType.SWAGGER),
new TestSet(name: 'ref-loop-array', processor: new TestProcessor(), parser: ParserType.OPENAPI4J)
new TestSet(name: 'schema-composed-allof', processor: new TestProcessor(), parser: ParserType.SWAGGER),
new TestSet(name: 'schema-composed-allof', processor: new TestProcessor(), parser: ParserType.OPENAPI4J)
]
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
items:
- generated/api/Api.java
- generated/model/QueryResponse200.java
- generated/model/QueryResponse200_AllOf_0.java
- generated/model/QueryResponse200_AllOf_1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* This class is auto generated by https://github.com/hauner/openapi-processor-core.
* TEST ONLY.
*/

package generated.api;

import annotation.Mapping;
import generated.model.QueryResponse200;

public interface Api {

@Mapping("/query")
QueryResponse200 getQuery();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* This class is auto generated by https://github.com/hauner/openapi-processor-core.
* TEST ONLY.
*/

package generated.model;

import com.fasterxml.jackson.annotation.JsonProperty;

public class QueryResponse200 {

@JsonProperty("prop1")
private String prop1;

@JsonProperty("prop2")
private String prop2;

public String getProp1() {
return prop1;
}

public void setProp1(String prop1) {
this.prop1 = prop1;
}

public String getProp2() {
return prop2;
}

public void setProp2(String prop2) {
this.prop2 = prop2;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* This class is auto generated by https://github.com/hauner/openapi-processor-core.
* TEST ONLY.
*/

package generated.model;

import com.fasterxml.jackson.annotation.JsonProperty;

public class QueryResponse200_AllOf_0 {

@JsonProperty("prop1")
private String prop1;

public String getProp1() {
return prop1;
}

public void setProp1(String prop1) {
this.prop1 = prop1;
}

}
Loading