Skip to content

Commit 7600d80

Browse files
committed
1 parent b172b04 commit 7600d80

File tree

14 files changed

+180
-4
lines changed

14 files changed

+180
-4
lines changed

openapi-processor-core/src/main/antlr/Mapping.g4

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ grammar Mapping;
77

88
// root:
99
mapping
10-
: type | map | annotate | content
10+
: type | map | annotate | content | name
1111
;
1212

1313
type
@@ -26,6 +26,10 @@ annotate
2626
: sourceType Annotate annotationType
2727
;
2828

29+
name
30+
: sourceIdentifier
31+
;
32+
2933
anyType
3034
: plainType | primitiveType | targetType
3135
;

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.openapiprocessor.core.converter
77

88
import io.openapiprocessor.core.converter.mapping.AddParameterTypeMapping
9+
import io.openapiprocessor.core.converter.mapping.DropParameterTypeMapping
910
import io.openapiprocessor.core.converter.mapping.TargetType
1011
import io.openapiprocessor.core.converter.mapping.UnknownDataTypeException
1112
import io.openapiprocessor.core.converter.mapping.UnknownParameterTypeException
@@ -176,9 +177,13 @@ class ApiConverter(
176177
private fun collectParameters(parameters: List<Parameter>, ctx: ApiConverterContext): List<ModelParameter> {
177178
val resultParameters: MutableList<ModelParameter> = mutableListOf()
178179

179-
parameters.forEach {
180-
resultParameters.add(createParameter(it, ctx))
181-
}
180+
val dropMappings = getDropParameterMappings(ctx.path, ctx.method)
181+
182+
parameters
183+
.filter { p -> dropMappings.find { it.parameterName == p.getName() } == null }
184+
.forEach {
185+
resultParameters.add(createParameter(it, ctx))
186+
}
182187

183188
val addMappings = getAdditionalParameterMappings (ctx.path, ctx.method)
184189
addMappings.forEach {
@@ -192,6 +197,10 @@ class ApiConverter(
192197
return mappingFinder.findAddParameterTypeMappings(MappingFinderQuery(path, method))
193198
}
194199

200+
private fun getDropParameterMappings(path: String, method: HttpMethod): List<DropParameterTypeMapping> {
201+
return mappingFinder.findDropParameterTypeMappings(MappingFinderQuery(path, method))
202+
}
203+
195204
data class RequestBodies(val bodies: List<ModelRequestBody>, val parameters: List<ModelParameter>)
196205

197206
private fun collectRequestBodies(requestBody: RequestBody?, ctx: ApiConverterContext): RequestBodies {

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,24 @@ class MappingFinder(val options: ApiOptions) {
363363
return repository.findGlobalAddParameterTypeMappings(step)
364364
}
365365

366+
fun findDropParameterTypeMappings(query: MappingQuery): List<DropParameterTypeMapping> {
367+
val step = rootStep("looking for drop parameter type mapping of", query)
368+
try {
369+
return findDropParameterTypeMappings(query, step)
370+
} finally {
371+
step.log()
372+
}
373+
}
374+
375+
private fun findDropParameterTypeMappings(query: MappingQuery, step: MappingStep): List<DropParameterTypeMapping> {
376+
val epMapping = repository.findEndpointDropParameterTypeMappings(query, step)
377+
if (epMapping.isNotEmpty()) {
378+
return epMapping
379+
}
380+
381+
return repository.findGlobalDropParameterTypeMappings(step)
382+
}
383+
366384
fun findContentTypeMapping(query: MappingQuery): ContentTypeMapping? {
367385
val step = rootStep("looking for content type type mapping of", query)
368386
try {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter.mapping
7+
8+
/**
9+
* configure parameters that should be dropped.
10+
*/
11+
class DropParameterTypeMapping(
12+
13+
/**
14+
* The parameter name of this mapping.
15+
*/
16+
val parameterName: String
17+
18+
): Mapping

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,22 @@ class EndpointMappings(
224224
return mappings
225225
}
226226

227+
fun findDropParameterTypeMappings(query: MappingQuery, step: MappingStep): List<DropParameterTypeMapping> {
228+
val httpMethodMappings = methodMappings[query.method]
229+
if (httpMethodMappings != null) {
230+
val methodMappings = httpMethodMappings.findDropParameterTypeMappings(
231+
DropParameterTypeMatcher(),
232+
step.add(MethodsStep(query)))
233+
234+
if (methodMappings.isNotEmpty()) {
235+
return methodMappings
236+
}
237+
}
238+
239+
val mappings = mappings.findDropParameterTypeMappings(DropParameterTypeMatcher(), step)
240+
return mappings
241+
}
242+
227243
fun findContentTypeMapping(query: MappingQuery, step: MappingStep): ContentTypeMapping? {
228244
val httpMethodMappings = methodMappings[query.method]
229245
if (httpMethodMappings != null) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ class MappingRepository(
6767
return globalMappings.findAddParameterTypeMappings(AddParameterTypeMatcher(), step.add(GlobalsStep()))
6868
}
6969

70+
fun findGlobalDropParameterTypeMappings(step: MappingStep): List<DropParameterTypeMapping> {
71+
return globalMappings.findDropParameterTypeMappings(DropParameterTypeMatcher(), step.add(GlobalsStep()))
72+
}
73+
7074
fun findGlobalContentTypeMapping(query: MappingQuery, step: MappingStep): ContentTypeMapping? {
7175
return globalMappings.findContentTypeMapping(ContentTypeMatcher(query), step.add(GlobalsStep()))
7276
}
@@ -123,6 +127,11 @@ class MappingRepository(
123127
return mappings.findAddParameterTypeMappings(query, step.add(EndpointsStep(query)))
124128
}
125129

130+
fun findEndpointDropParameterTypeMappings(query: MappingQuery, step: MappingStep): List<DropParameterTypeMapping> {
131+
val mappings = endpointMappings[query.path] ?: return emptyList()
132+
return mappings.findDropParameterTypeMappings(query, step.add(EndpointsStep(query)))
133+
}
134+
126135
fun findEndpointContentTypeMapping(query: MappingQuery, step: MappingStep): ContentTypeMapping? {
127136
return endpointMappings[query.path]?.findContentTypeMapping(query, step.add(EndpointsStep(query)))
128137
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,15 @@ class Mappings(
152152
return mappings.map { it as AddParameterTypeMapping }
153153
}
154154

155+
fun findDropParameterTypeMappings(filter: MappingMatcher, step: MappingStep): List<DropParameterTypeMapping> {
156+
val mappings = parameterTypeMappings.filter(filter, step.add(ParametersStep("drop")))
157+
if (mappings.isEmpty()) {
158+
return emptyList()
159+
}
160+
161+
return mappings.map { it as DropParameterTypeMapping }
162+
}
163+
155164
fun findContentTypeMapping(filter: MappingMatcher, step: MappingStep): ContentTypeMapping? {
156165
val mappings = responseTypeMappings.filter(filter, step.add(ContentTypesStep()))
157166
if (mappings.isEmpty()) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter.mapping.matcher
7+
8+
import io.openapiprocessor.core.converter.mapping.DropParameterTypeMapping
9+
import io.openapiprocessor.core.converter.mapping.Mapping
10+
import io.openapiprocessor.core.converter.mapping.MappingMatcher
11+
import io.openapiprocessor.core.converter.mapping.steps.MappingStep
12+
13+
class DropParameterTypeMatcher: MappingMatcher {
14+
15+
override fun match(mapping: Mapping, step: MappingStep): Boolean {
16+
return mapping is DropParameterTypeMapping
17+
}
18+
19+
override fun toString(): String {
20+
return "drop parameter"
21+
}
22+
}

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/processor/mapping/v2/MappingConverter.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ class MappingConverter(val mapping: MappingV2) {
206206
is AdditionalParameter -> {
207207
createAddParameterTypeMapping(source)
208208
}
209+
// - drop: parameter name
210+
is UnnecessaryParameter -> {
211+
createDropParameterTypeMapping(source)
212+
}
209213
// - type: OpenAPI type => target type
210214
// - type: OpenAPI type @ annotation
211215
is Type -> {
@@ -257,6 +261,12 @@ class MappingConverter(val mapping: MappingV2) {
257261
return AddParameterTypeMapping(mapping.sourceType!!, typeMapping, annotation)
258262
}
259263

264+
private fun createDropParameterTypeMapping(source: UnnecessaryParameter): DropParameterTypeMapping {
265+
val (mapping, _) = parseMapping(source.drop, emptyList())
266+
267+
return DropParameterTypeMapping(mapping.sourceType!!)
268+
}
269+
260270
private fun convertResponse(source: Response): Mapping {
261271
val (mapping, genericTypes) = parseMapping(source.content, source.generics)
262272

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/processor/mapping/v2/ParameterDeserializer.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ class ParameterDeserializer : StdDeserializer<Parameter>(Parameter::class.java)
3434
return AdditionalParameter(name, generics)
3535
}
3636

37+
if (props != null && isUnnecessaryParameter(props)) {
38+
val name = props["drop"] as String
39+
40+
return UnnecessaryParameter(name)
41+
}
42+
3743
if (props != null && isType(props)) {
3844
val type = props["type"] as String
3945
val generics = props["generics"] as List<String>?
@@ -52,6 +58,10 @@ class ParameterDeserializer : StdDeserializer<Parameter>(Parameter::class.java)
5258
return source.contains("add")
5359
}
5460

61+
private fun isUnnecessaryParameter(source: Map<*, *>): Boolean {
62+
return source.contains("drop")
63+
}
64+
5565
private fun isType(source: Map<*, *>): Boolean {
5666
return source.contains("type")
5767
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-base
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.processor.mapping.v2
7+
8+
/**
9+
* a "parameters:" drop parameter entry in the mapping yaml
10+
*/
11+
data class UnnecessaryParameter(
12+
13+
/**
14+
* the mapping of a parameter to drop, ie a mapping string like:
15+
*
16+
* drop: name
17+
*/
18+
val drop: String
19+
20+
): Parameter

openapi-processor-core/src/main/resources/mapping/v12/mapping.yaml.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@
373373
"add": {
374374
"$ref": "#/definitions/TypeMappingFormat"
375375
},
376+
"drop": {
377+
"type": "string"
378+
},
376379
"type": {
377380
"anyOf": [{
378381
"$ref": "#/definitions/TypeMappingFormat"

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,26 @@ class MappingFinderEndpointMethodSpec: StringSpec({
125125
result[1].parameterName.shouldBe("barParam")
126126
}
127127

128+
"endpoint/method drop parameter mapping matches" {
129+
val options = parseOptions(mapping =
130+
"""
131+
|map:
132+
| paths:
133+
| /foo:
134+
| get:
135+
| parameters:
136+
| - drop: fooParam
137+
| - drop: barParam
138+
""")
139+
140+
val finder = mappingFinder(options)
141+
val result = finder.findDropParameterTypeMappings(query(path = "/foo", method = GET))
142+
143+
result.shouldNotBeEmpty()
144+
result[0].parameterName.shouldBe("fooParam")
145+
result[1].parameterName.shouldBe("barParam")
146+
}
147+
128148
"endpoint/method result mapping matches" {
129149
val options = parseOptions(mapping =
130150
"""

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/processor/mapping/v2/AntlrParserSpec.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,4 +352,12 @@ class AntlrParserSpec: StringSpec({
352352
mapping.annotationParameters["pattern"]!!.value shouldBe """"yyyy""""
353353
}
354354

355+
"map simple string" {
356+
val source = "name"
357+
358+
val mapping = parseMapping(source)
359+
mapping.kind shouldBe Mapping.Kind.MAP
360+
mapping.sourceType shouldBe "name"
361+
mapping.targetType shouldBe null
362+
}
355363
})

0 commit comments

Comments
 (0)