Skip to content

Commit 0a4ed0b

Browse files
authored
Merge pull request #1080 from swagger-api/issue-1063
fix for Parameter Validation Issue
2 parents b06bd06 + 8402163 commit 0a4ed0b

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import io.swagger.v3.core.util.Json;
5353
import io.swagger.v3.core.util.RefUtils;
5454

55+
import io.swagger.v3.parser.models.RefFormat;
5556
import org.apache.commons.lang3.StringUtils;
5657

5758
import static io.swagger.v3.core.util.RefUtils.extractSimpleName;
@@ -103,7 +104,7 @@ public class OpenAPIDeserializer {
103104
private static final String HEADER_PARAMETER = "header";
104105
private static final Pattern RFC3339_DATE_TIME_PATTERN = Pattern.compile( "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(\\.\\d+)?((Z)|([+-]\\d{2}:\\d{2}))$");
105106
private static final Pattern RFC3339_DATE_PATTERN = Pattern.compile( "^(\\d{4})-(\\d{2})-(\\d{2})$");
106-
107+
private static final String REFERENCE_SEPARATOR = "#/";
107108
private Components components;
108109
private final Set<String> operationIDs = new HashSet<>();
109110

@@ -1422,9 +1423,17 @@ public List<Parameter> getParameterList(ArrayNode obj, String location, ParseRes
14221423
}
14231424
Set<String> filter = new HashSet<>();
14241425

1426+
14251427
parameters.stream().map(this::getParameterDefinition).forEach(param -> {
1428+
String ref = param.get$ref();
14261429
if(!filter.add(param.getName()+"#"+param.getIn())) {
1427-
result.warning(location,"There are duplicate parameter values");
1430+
if(ref != null) {
1431+
if (ref.startsWith(REFERENCE_SEPARATOR)) {// validate if it's inline param also
1432+
result.warning(location, "There are duplicate parameter values");
1433+
}
1434+
}else{
1435+
result.warning(location, "There are duplicate parameter values");
1436+
}
14281437
}
14291438
});
14301439
return parameters;

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1869,6 +1869,26 @@ public void shouldParseApiWithMultipleParameterReferences() {
18691869

18701870
}
18711871

1872+
@Test
1873+
public void testIssue1063() {
1874+
// given
1875+
String location = "src/test/resources/issue-1063/openapi.yaml";
1876+
ParseOptions options = new ParseOptions();
1877+
options.setResolve(true);
1878+
OpenAPIV3Parser tested = new OpenAPIV3Parser();
1879+
1880+
// when
1881+
SwaggerParseResult result = tested.readLocation(location, emptyList(), options);
1882+
1883+
// then
1884+
OpenAPI api = result.getOpenAPI();
1885+
assertEquals(api.getPaths().get("/anPath").getGet().getParameters().get(0).getName(), "customer-id");
1886+
assertEquals(api.getPaths().get("/anPath").getGet().getParameters().get(1).getName(), "unit-id");
1887+
1888+
assertThat(result.getMessages(), equalTo(emptyList()));
1889+
1890+
}
1891+
18721892
private static int getDynamicPort() {
18731893
return new Random().ints(10000, 20000).findFirst().getAsInt();
18741894
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
openapi: 3.0.0
2+
info:
3+
version: 1.0.0
4+
title: an API
5+
description: An API for reproduce a *There are duplicate parameter values*.
6+
7+
paths:
8+
/anPath:
9+
get:
10+
parameters:
11+
- $ref: './references.oas3.yaml#/components/parameters/ParamQ_One'
12+
- $ref: './references.oas3.yaml#/components/parameters/ParamQ_Two'
13+
responses:
14+
'200':
15+
description: OK
16+
content:
17+
application/json:
18+
schema:
19+
type: array
20+
items:
21+
type: string
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
components:
2+
parameters:
3+
ParamQ_One:
4+
in: query
5+
name: customer-id
6+
required: true
7+
schema:
8+
format: int32
9+
type: integer
10+
ParamQ_Two:
11+
in: query
12+
name: unit-id
13+
schema:
14+
format: int32
15+
type: integer

0 commit comments

Comments
 (0)