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

Commit cea2c6f

Browse files
committed
openapi-processor/openapi-processor-spring#124, improve name handling of $ref's
1 parent 56e5cb2 commit cea2c6f

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

src/main/kotlin/io/openapiprocessor/core/parser/RefResolver.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ package io.openapiprocessor.core.parser
1818

1919
/**
2020
* Resolves $ref objects from an OpenAPI.
21-
*
22-
* @author Martin Hauner
2321
*/
2422
interface RefResolver {
23+
fun resolve(ref: Schema): NamedSchema
24+
}
2525

26-
fun resolve(ref: Schema): Schema
27-
26+
class NamedSchema(val name: String?, val schema: Schema) {
27+
val hasName = name != null
28+
val hasNoName = name == null
2829
}

src/main/kotlin/io/openapiprocessor/core/parser/openapi4j/RefResolver.kt

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

1717
package io.openapiprocessor.core.parser.openapi4j
1818

19+
import io.openapiprocessor.core.parser.NamedSchema
1920
import io.openapiprocessor.core.parser.RefResolver as ParserRefResolver
2021
import io.openapiprocessor.core.parser.Schema as ParserSchema
2122
import org.openapi4j.parser.model.v3.OpenApi3 as O4jOpenApi
@@ -28,7 +29,7 @@ import org.openapi4j.parser.model.v3.Schema as O4jSchema
2829
*/
2930
class RefResolver(private val api: O4jOpenApi): ParserRefResolver {
3031

31-
override fun resolve(ref: ParserSchema): ParserSchema {
32+
override fun resolve(ref: ParserSchema): NamedSchema {
3233
val resolved: O4jSchema
3334

3435
val refName = getRefName(ref.getRef()!!)
@@ -40,11 +41,16 @@ class RefResolver(private val api: O4jOpenApi): ParserRefResolver {
4041
o4jSchema.getReference(api.context).getMappedContent(O4jSchema::class.java)
4142
}
4243

43-
return Schema (resolved)
44+
return NamedSchema (refName, Schema(resolved))
4445
}
4546

46-
private fun getRefName(ref: String): String {
47-
return ref.substring(ref.lastIndexOf('/') + 1)
47+
private fun getRefName(ref: String): String? {
48+
val split = ref.split('#')
49+
if (split.size > 1) {
50+
val hash = split[1]
51+
return hash.substring(hash.lastIndexOf('/') + 1)
52+
}
53+
return null
4854
}
4955

5056
}

src/main/kotlin/io/openapiprocessor/core/parser/swagger/RefResolver.kt

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

1717
package io.openapiprocessor.core.parser.swagger
1818

19+
import io.openapiprocessor.core.parser.NamedSchema as ParserNamedSchema
1920
import io.openapiprocessor.core.parser.RefResolver as ParserRefResolver
2021
import io.openapiprocessor.core.parser.Schema as ParserSchema
2122
import io.swagger.v3.oas.models.media.Schema as SwaggerSchema
@@ -28,19 +29,24 @@ import io.swagger.v3.oas.models.OpenAPI
2829
*/
2930
class RefResolver(private val openapi: OpenAPI): ParserRefResolver {
3031

31-
override fun resolve(ref: ParserSchema): ParserSchema {
32+
override fun resolve(ref: ParserSchema): ParserNamedSchema {
3233
val refName = getRefName(ref.getRef()!!)
3334

3435
val schema: SwaggerSchema<*>? = openapi.components?.schemas?.get(refName)
3536
if (schema == null) {
3637
throw Exception("failed to resolve ${ref.getRef()}")
3738
}
3839

39-
return Schema(schema)
40+
return ParserNamedSchema(refName, Schema(schema))
4041
}
4142

42-
private fun getRefName(ref: String): String {
43-
return ref.substring(ref.lastIndexOf('/') + 1)
43+
private fun getRefName(ref: String): String? {
44+
val split = ref.split('#')
45+
if (split.size > 1) {
46+
val hash = split[1]
47+
return hash.substring(hash.lastIndexOf('/') + 1)
48+
}
49+
return null
4450
}
4551

4652
}

src/test/groovy/com/github/hauner/openapi/core/converter/DataTypeConverterSpec.groovy

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ import io.openapiprocessor.core.model.HttpMethod
2929
import io.openapiprocessor.core.model.datatypes.ObjectDataType
3030
import com.github.hauner.openapi.core.test.TestSchema
3131
import io.openapiprocessor.core.converter.mapping.UnknownDataTypeException
32+
import io.openapiprocessor.core.parser.NamedSchema
3233
import io.openapiprocessor.core.parser.RefResolver
3334
import io.openapiprocessor.core.parser.Schema
35+
import org.jetbrains.annotations.NotNull
3436
import spock.lang.Specification
3537
import spock.lang.Unroll
3638

@@ -126,9 +128,10 @@ class DataTypeConverterSpec extends Specification {
126128
])
127129
128130
def resolver = new RefResolver () {
131+
129132
@Override
130-
Schema resolve (Schema ref) {
131-
barSchema
133+
NamedSchema resolve (@NotNull Schema ref) {
134+
return new NamedSchema("Bar", barSchema)
132135
}
133136
}
134137

0 commit comments

Comments
 (0)