Skip to content

Commit 6a6760a

Browse files
authored
Merge pull request #1400 from swagger-api/null-missing
process exampleSetFlag to flag deserialization of null example vs missing
2 parents 991b5f8 + 5404631 commit 6a6760a

File tree

4 files changed

+69
-16
lines changed

4 files changed

+69
-16
lines changed

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.databind.JsonNode;
44
import com.fasterxml.jackson.databind.node.ArrayNode;
55
import com.fasterxml.jackson.databind.node.JsonNodeType;
6+
import com.fasterxml.jackson.databind.node.NullNode;
67
import com.fasterxml.jackson.databind.node.ObjectNode;
78
import com.fasterxml.jackson.databind.node.TextNode;
89
import io.swagger.v3.oas.models.Components;
@@ -997,7 +998,7 @@ public MediaType getMediaType(ObjectNode contentNode, String location, ParseResu
997998

998999
Object example = getAnyExample("example",contentNode, location,result);
9991000
if (example != null){
1000-
mediaType.setExample(example);
1001+
mediaType.setExample(example instanceof NullNode ? null : example);
10011002
}
10021003

10031004

@@ -1579,7 +1580,7 @@ public Parameter getParameter(ObjectNode obj, String location, ParseResult resul
15791580

15801581
Object example = getAnyExample("example", obj, location,result);
15811582
if (example != null){
1582-
parameter.setExample(example);
1583+
parameter.setExample(example instanceof NullNode ? null : example);
15831584
}
15841585

15851586
Boolean allowReserved = getBoolean("allowReserved", obj, false, location, result);
@@ -1699,7 +1700,7 @@ public Header getHeader(ObjectNode headerNode, String location, ParseResult resu
16991700

17001701
Object example = getAnyExample("example", headerNode, location,result);
17011702
if (example != null){
1702-
header.setExample(example);
1703+
header.setExample(example instanceof NullNode ? null : example);
17031704
}
17041705

17051706
ObjectNode contentNode = getObject("content",headerNode,false,location,result);
@@ -1753,6 +1754,8 @@ public Object getAnyExample(String nodeKey,ObjectNode node, String location, Par
17531754
if (bool != null){
17541755
return bool;
17551756
}
1757+
} else if (example.getNodeType().equals(JsonNodeType.NULL)){
1758+
return example;
17561759
}
17571760
}
17581761
return null;
@@ -2415,8 +2418,8 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
24152418
}
24162419

24172420
Object example = getAnyExample("example", node, location,result);
2418-
if (example != null){
2419-
schema.setExample(example);
2421+
if (example != null ){
2422+
schema.setExample(example instanceof NullNode ? null : example);
24202423
}
24212424

24222425
bool = getBoolean("deprecated", node, false, location, result);
@@ -2614,7 +2617,7 @@ public Example getExample(ObjectNode node, String location, ParseResult result)
26142617

26152618
Object sample = getAnyExample("value", node, location,result);
26162619
if (sample != null){
2617-
example.setValue(sample);
2620+
example.setValue(sample instanceof NullNode ? null : sample);
26182621
}
26192622

26202623

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

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,31 @@ public void testIssue1367() {
9696
assertTrue(((Schema)openAPI.getComponents().getSchemas().get("TestDTO").getProperties().get("choice")).getEnum() != null);
9797
}
9898

99+
@Test
100+
public void testDeserializeExampleFlag() {
101+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
102+
ParseOptions options = new ParseOptions();
103+
options.setResolve(true);
104+
options.setResolveCombinators(true);
105+
options.setResolveFully(true);
106+
options.setFlatten(true);
107+
SwaggerParseResult parseResult = openApiParser.readLocation("exampleFlag.yaml", null, options);
108+
OpenAPI openAPI = parseResult.getOpenAPI();
109+
assertTrue(openAPI.getComponents().getSchemas().get("TestDTO").getExampleSetFlag());
110+
assertNull(openAPI.getComponents().getSchemas().get("TestDTO").getExample());
111+
assertTrue(openAPI.getComponents().getSchemas().get("TestString").getExampleSetFlag());
112+
assertNull(openAPI.getComponents().getSchemas().get("TestString").getExample());
113+
assertTrue(openAPI.getComponents().getSchemas().get("TestNumber").getExampleSetFlag());
114+
assertNull(openAPI.getComponents().getSchemas().get("TestNumber").getExample());
115+
116+
assertFalse(openAPI.getComponents().getSchemas().get("TestDTOMissing").getExampleSetFlag());
117+
assertNull(openAPI.getComponents().getSchemas().get("TestDTOMissing").getExample());
118+
assertFalse(openAPI.getComponents().getSchemas().get("TestStringMissing").getExampleSetFlag());
119+
assertNull(openAPI.getComponents().getSchemas().get("TestStringMissing").getExample());
120+
assertFalse(openAPI.getComponents().getSchemas().get("TestNumberMissing").getExampleSetFlag());
121+
assertNull(openAPI.getComponents().getSchemas().get("TestNumberMissing").getExample());
122+
}
123+
99124
@Test
100125
public void testIssueFlattenAdditionalPropertiesSchemaInlineModelTrue() {
101126
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
@@ -2241,7 +2266,7 @@ public void shouldParseApiWithMultipleParameterReferences() {
22412266
assertThat(parameters.keySet(), equalTo(new HashSet<>(asList("IdParam", "NameParam"))));
22422267
assertThat(parameters.get("IdParam").getName(), equalTo("id"));
22432268
assertThat(parameters.get("NameParam").getName(), equalTo("name"));
2244-
2269+
22452270
assertThat(result.getMessages(), equalTo(emptyList()));
22462271

22472272
}
@@ -2250,22 +2275,22 @@ public void shouldParseApiWithMultipleParameterReferences() {
22502275
public void shouldParseApiWithParametersUsingContentvsSchema() {
22512276
// Tests that the content method of specifying the format of a parameter
22522277
// gets resolved.
2253-
// Test checks if an API's single parameter of array type gets fully resolved to
2278+
// Test checks if an API's single parameter of array type gets fully resolved to
22542279
// referenced definitions.
22552280
String location = "src/test/resources/issue-1078/api.yaml";
22562281
ParseOptions options = new ParseOptions();
22572282
options.setResolve(true);
22582283
// This test uses an Array in the parameters, test if it get's fully resolved.
22592284
options.setResolveFully(true);
22602285
OpenAPIV3Parser tested = new OpenAPIV3Parser();
2261-
2286+
22622287
// Parse yaml
22632288
SwaggerParseResult result = tested.readLocation(location, emptyList(), options);
22642289

22652290
OpenAPI api = result.getOpenAPI();
22662291
Paths paths = api.getPaths();
22672292

2268-
// First ensure all schemas were resolved, this is important when this library
2293+
// First ensure all schemas were resolved, this is important when this library
22692294
// is used to generate code
22702295
Components components = api.getComponents();
22712296
assertNotNull(components);
@@ -2274,13 +2299,13 @@ public void shouldParseApiWithParametersUsingContentvsSchema() {
22742299
assertNotNull(components.getSchemas().get("Lat"));
22752300
assertNotNull(components.getSchemas().get("Long"));
22762301
assertNotNull(components.getSchemas().get("SearchResult"));
2277-
2302+
22782303
PathItem apiEndpoint = paths.get("/api-endpoint-1");
22792304
List<Parameter> parameters = apiEndpoint.getGet().getParameters();
2280-
2305+
22812306
// Ensure there's only one parameter in this test
22822307
assertThat(parameters.size(), equalTo(1));
2283-
2308+
22842309
// We are testing content for a parameter so make sure its there.
22852310
Content content = parameters.get(0).getContent();
22862311
assertNotNull(content);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
openapi: 3.0.0
2+
info:
3+
version: 1.0.1
4+
title: Products API definition for the 4th Platform
5+
paths:
6+
'/TestDTO':
7+
get:
8+
operationId: description
9+
components:
10+
schemas:
11+
TestDTO:
12+
type: object
13+
example: null
14+
TestString:
15+
type: string
16+
example: null
17+
TestNumber:
18+
type: integer
19+
example: null
20+
TestDTOMissing:
21+
type: object
22+
TestStringMissing:
23+
type: string
24+
TestNumberMissing:
25+
type: integer

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,15 +288,15 @@
288288
<swagger-parser-v2-version>1.0.52-SNAPSHOT</swagger-parser-v2-version>
289289
<commons-io-version>2.6</commons-io-version>
290290
<slf4j-version>1.7.30</slf4j-version>
291-
<swagger-core-version>2.1.2</swagger-core-version>
292-
<swagger-core-v2-version>1.6.1</swagger-core-v2-version>
291+
<swagger-core-version>2.1.4-SNAPSHOT</swagger-core-version>
292+
<swagger-core-v2-version>1.6.2</swagger-core-v2-version>
293293
<junit-version>4.13</junit-version>
294294
<testng-version>6.14.2</testng-version>
295295
<jmockit-version>1.35</jmockit-version>
296296
<wiremock-version>2.15.0</wiremock-version>
297297
<surefire-version>2.22.2</surefire-version>
298298
<commons-lang-version>3.2.1</commons-lang-version>
299-
<jackson-version>2.10.2</jackson-version>
299+
<jackson-version>2.11.1</jackson-version>
300300
</properties>
301301

302302
</project>

0 commit comments

Comments
 (0)