Skip to content

Commit 22025d1

Browse files
committed
support generic parameters on global type mappings
1 parent 77f7c1e commit 22025d1

File tree

5 files changed

+88
-12
lines changed

5 files changed

+88
-12
lines changed

src/main/groovy/com/github/hauner/openapi/spring/converter/DataTypeConverter.groovy

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@ class DataTypeConverter {
6969
]
7070
]
7171

72+
private class TargetType {
73+
String typeName
74+
List<String> genericNames
75+
76+
String getName () {
77+
typeName.substring (typeName.lastIndexOf ('.') + 1)
78+
}
79+
80+
String getPkg () {
81+
typeName.substring (0, typeName.lastIndexOf ('.'))
82+
}
83+
84+
}
85+
7286
private ApiOptions options
7387

7488
DataTypeConverter(ApiOptions options) {
@@ -135,11 +149,12 @@ class DataTypeConverter {
135149
private DataType createObjectDataType (SchemaInfo schemaInfo, DataTypes dataTypes) {
136150
def objectType
137151

138-
String targetTypeName = getObjectDataType (schemaInfo)
139-
if (targetTypeName) {
152+
TargetType targetType = getObjectDataType (schemaInfo)
153+
if (targetType) {
140154
objectType = new MappedDataType (
141-
type: targetTypeName.substring (targetTypeName.lastIndexOf ('.') + 1),
142-
pkg: targetTypeName.substring (0, targetTypeName.lastIndexOf ('.'))
155+
type: targetType.name,
156+
pkg: targetType.pkg,
157+
genericTypes: targetType.genericNames
143158
)
144159

145160
dataTypes.add (schemaInfo.name, objectType)
@@ -186,7 +201,7 @@ class DataTypeConverter {
186201
}
187202

188203

189-
private String getObjectDataType(SchemaInfo schemaInfo) {
204+
private TargetType getObjectDataType(SchemaInfo schemaInfo) {
190205
if (options.typeMappings) {
191206

192207
List<EndpointTypeMapping> endpoints = getEndpointMappings ()
@@ -202,7 +217,10 @@ class DataTypeConverter {
202217

203218
def response = responses.find { it.contentType == ct && it.sourceTypeName == 'object' }
204219
if (response) {
205-
return response.targetTypeName
220+
return new TargetType (
221+
typeName: response.targetTypeName,
222+
genericNames: []
223+
)
206224
}
207225
}
208226
}
@@ -221,7 +239,9 @@ class DataTypeConverter {
221239
}
222240

223241
def mapping = mappings.first ()
224-
return mapping.targetTypeName
242+
return new TargetType (
243+
typeName: mapping.targetTypeName,
244+
genericNames: mapping.genericTypeNames ?: [])
225245
}
226246

227247
null

src/main/groovy/com/github/hauner/openapi/spring/generatr/mapping/TypeMapping.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,9 @@ class TypeMapping {
3737
*/
3838
String targetTypeName
3939

40+
/**
41+
* The fully qualified java type names of all generic parameters to {@link #targetTypeName}.
42+
*/
43+
List<String> genericTypeNames = []
44+
4045
}

src/main/groovy/com/github/hauner/openapi/spring/model/datatypes/MappedDataType.groovy

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@ package com.github.hauner.openapi.spring.model.datatypes
2323
*/
2424
class MappedDataType implements DataType {
2525

26-
String type
26+
private String type
2727
String pkg = 'unknown'
28+
List<String> genericTypes = []
2829

2930
@Override
3031
String getName () {
31-
type
32+
if (genericTypes.empty) {
33+
"${type}"
34+
} else {
35+
"${type}<${getGenericTypeNames().join (', ')}>"
36+
}
3237
}
3338

3439
@Override
@@ -38,12 +43,22 @@ class MappedDataType implements DataType {
3843

3944
@Override
4045
String getImport () {
41-
[packageName, name].join ('.')
46+
[packageName, type].join ('.')
4247
}
4348

4449
@Override
4550
Set<String> getImports () {
46-
[]
51+
[getImport ()] + genericTypes
52+
}
53+
54+
private List<String> getGenericTypeNames () {
55+
genericTypes.collect {
56+
getClassName (it)
57+
}
58+
}
59+
60+
private String getClassName (String ref) {
61+
ref.substring (ref.lastIndexOf ('.') + 1)
4762
}
4863

4964
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.github.hauner.openapi.spring.model.datatypes
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
class MappedDataTypeSpec extends Specification {
7+
8+
@Unroll
9+
void "get name of type with (optional) generic parameters" () {
10+
def type = new MappedDataType(pkg: 'model', type: 'Foo', genericTypes: generics)
11+
12+
expect:
13+
type.name == typeName
14+
15+
where:
16+
generics | typeName
17+
[] | 'Foo'
18+
['java.lang.String'] | 'Foo<String>'
19+
['java.lang.String', 'java.lang.String'] | 'Foo<String, String>'
20+
}
21+
22+
@Unroll
23+
void "get imports of type with (optional) generic parameters" () {
24+
def type = new MappedDataType(pkg: 'model', type: 'Foo', genericTypes: generics)
25+
26+
expect:
27+
type.imports == imports as Set
28+
29+
where:
30+
generics | imports
31+
[] | ['model.Foo']
32+
['java.lang.String'] | ['model.Foo', 'java.lang.String']
33+
['java.lang.String', 'java.lang.String'] | ['model.Foo', 'java.lang.String']
34+
}
35+
36+
}

src/testInt/groovy/com/github/hauner/openapi/generatr/GeneratrPendingTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import com.github.hauner.openapi.spring.generatr.mapping.ResponseTypeMapping
2323
import org.junit.runner.RunWith
2424
import org.junit.runners.Parameterized
2525

26-
//@Ignore
26+
@Ignore
2727
@RunWith(Parameterized)
2828
class GeneratrPendingTest extends GeneratrTestBase {
2929

0 commit comments

Comments
 (0)