Skip to content
This repository was archived by the owner on Nov 24, 2022. It is now read-only.

Commit a41877b

Browse files
authored
Merge pull request swagger-api#1065 from jakubmalek/master
Fixed referenced parameters validation
2 parents f94d751 + c168e29 commit a41877b

3 files changed

Lines changed: 76 additions & 2 deletions

File tree

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@
4646
import io.swagger.v3.oas.models.servers.ServerVariables;
4747
import io.swagger.v3.parser.core.models.SwaggerParseResult;
4848
import io.swagger.v3.core.util.Json;
49+
import io.swagger.v3.core.util.RefUtils;
50+
4951
import org.apache.commons.lang3.StringUtils;
5052

53+
import static io.swagger.v3.core.util.RefUtils.extractSimpleName;
54+
5155
import java.math.BigDecimal;
5256
import java.net.URI;
5357
import java.net.URISyntaxException;
@@ -1408,13 +1412,25 @@ public List<Parameter> getParameterList(ArrayNode obj, String location, ParseRes
14081412
}
14091413
Set<String> filter = new HashSet<>();
14101414

1411-
for(Parameter param:parameters) {
1415+
parameters.stream().map(this::getParameterDefinition).forEach(param -> {
14121416
if(!filter.add(param.getName()+"#"+param.getIn())) {
14131417
result.warning(location,"There are duplicate parameter values");
14141418
}
1415-
}
1419+
});
14161420
return parameters;
14171421
}
1422+
1423+
private Parameter getParameterDefinition(Parameter parameter) {
1424+
if (parameter.get$ref() == null) {
1425+
return parameter;
1426+
}
1427+
Object parameterSchemaName = extractSimpleName(parameter.get$ref()).getLeft();
1428+
return Optional.ofNullable(components)
1429+
.map(Components::getParameters)
1430+
.map(parameters -> parameters.get(parameterSchemaName))
1431+
.orElse(parameter);
1432+
1433+
}
14181434

14191435
public Parameter getParameter(ObjectNode obj, String location, ParseResult result) {
14201436
if (obj == null) {

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import java.util.*;
5353

5454
import static com.github.tomakehurst.wiremock.client.WireMock.*;
55+
import static java.util.Arrays.asList;
56+
import static java.util.Collections.emptyList;
5557
import static org.hamcrest.CoreMatchers.equalTo;
5658
import static org.hamcrest.CoreMatchers.instanceOf;
5759
import static org.hamcrest.CoreMatchers.notNullValue;
@@ -1801,6 +1803,26 @@ public void shouldParseExternalSchemaModelHavingReferenceToItsLocalModel() {
18011803
assertThat(((Schema) modelSchema.getProperties().get("id")).get$ref(), equalTo("#/components/schemas/ValueId"));
18021804
}
18031805

1806+
@Test
1807+
public void shouldParseApiWithMultipleParameterReferences() {
1808+
// given
1809+
String location = "src/test/resources/issue-1063/api.yaml";
1810+
ParseOptions options = new ParseOptions();
1811+
OpenAPIV3Parser tested = new OpenAPIV3Parser();
1812+
1813+
// when
1814+
SwaggerParseResult result = tested.readLocation(location, emptyList(), options);
1815+
1816+
// then
1817+
OpenAPI api = result.getOpenAPI();
1818+
Map<String, Parameter> parameters = api.getComponents().getParameters();
1819+
assertThat(parameters.keySet(), equalTo(new HashSet<>(asList("IdParam", "NameParam"))));
1820+
assertThat(parameters.get("IdParam").getName(), equalTo("id"));
1821+
assertThat(parameters.get("NameParam").getName(), equalTo("name"));
1822+
1823+
assertThat(result.getMessages(), equalTo(emptyList()));
1824+
}
1825+
18041826
private static int getDynamicPort() {
18051827
return new Random().ints(10000, 20000).findFirst().getAsInt();
18061828
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Test
4+
version: 1.0.0
5+
6+
paths:
7+
/value:
8+
get:
9+
operationId: getValues
10+
parameters:
11+
- $ref: '#/components/parameters/IdParam'
12+
- $ref: '#/components/parameters/NameParam'
13+
responses:
14+
200:
15+
description: Successful response
16+
content:
17+
application/json:
18+
schema:
19+
type:
20+
string
21+
22+
components:
23+
parameters:
24+
IdParam:
25+
required: true
26+
name: id
27+
in: query
28+
schema:
29+
type: integer
30+
format: int64
31+
NameParam:
32+
required: false
33+
name: name
34+
in: query
35+
schema:
36+
type: string

0 commit comments

Comments
 (0)