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

Commit 49fc009

Browse files
authored
Merge branch 'master' into issue-1049
2 parents 2ec4df2 + a41877b commit 49fc009

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
@@ -49,8 +49,12 @@
4949
import io.swagger.v3.oas.models.servers.ServerVariables;
5050
import io.swagger.v3.parser.core.models.SwaggerParseResult;
5151
import io.swagger.v3.core.util.Json;
52+
import io.swagger.v3.core.util.RefUtils;
53+
5254
import org.apache.commons.lang3.StringUtils;
5355

56+
import static io.swagger.v3.core.util.RefUtils.extractSimpleName;
57+
5458
import java.math.BigDecimal;
5559
import java.net.URI;
5660
import java.net.URISyntaxException;
@@ -1417,13 +1421,25 @@ public List<Parameter> getParameterList(ArrayNode obj, String location, ParseRes
14171421
}
14181422
Set<String> filter = new HashSet<>();
14191423

1420-
for(Parameter param:parameters) {
1424+
parameters.stream().map(this::getParameterDefinition).forEach(param -> {
14211425
if(!filter.add(param.getName()+"#"+param.getIn())) {
14221426
result.warning(location,"There are duplicate parameter values");
14231427
}
1424-
}
1428+
});
14251429
return parameters;
14261430
}
1431+
1432+
private Parameter getParameterDefinition(Parameter parameter) {
1433+
if (parameter.get$ref() == null) {
1434+
return parameter;
1435+
}
1436+
Object parameterSchemaName = extractSimpleName(parameter.get$ref()).getLeft();
1437+
return Optional.ofNullable(components)
1438+
.map(Components::getParameters)
1439+
.map(parameters -> parameters.get(parameterSchemaName))
1440+
.orElse(parameter);
1441+
1442+
}
14271443

14281444
public Parameter getParameter(ObjectNode obj, String location, ParseResult result) {
14291445
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)