Skip to content

Commit 7d6bad8

Browse files
authored
Merge pull request #2047 from garydgregory/Issue2046
[Issue 2046] NPE in OpenAPIV3Parser.read(String, List<AuthorizationValue>, ParseOptions)
2 parents d057528 + 6717e8e commit 7d6bad8

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
import io.swagger.v3.oas.models.security.SecurityRequirement;
1515
import io.swagger.v3.oas.models.security.SecurityScheme;
1616
import io.swagger.v3.oas.models.tags.Tag;
17+
import io.swagger.v3.parser.OpenAPIV3Parser;
1718
import io.swagger.v3.parser.converter.SwaggerConverter;
19+
import io.swagger.v3.parser.core.extensions.SwaggerParserExtension;
1820
import io.swagger.v3.parser.core.models.AuthorizationValue;
1921
import io.swagger.v3.parser.core.models.ParseOptions;
2022
import io.swagger.v3.parser.core.models.SwaggerParseResult;
23+
24+
import org.testng.Assert;
2125
import org.testng.annotations.Test;
2226

2327
import java.io.IOException;
@@ -923,4 +927,42 @@ public void testConvertFormDataAsObjectSchema() throws Exception {
923927
assertEquals(companiesSchema.getClass(), ObjectSchema.class);
924928

925929
}
930+
931+
/**
932+
* A clone (almost) of {@link OpenAPIV3Parser#readContents(String, List, ParseOptions)}.
933+
*/
934+
private OpenAPI read(String location, List<AuthorizationValue> auths, ParseOptions resolve, final List<SwaggerParserExtension> parserExtensions) {
935+
if (location == null) {
936+
return null;
937+
}
938+
SwaggerParseResult parsed;
939+
for (SwaggerParserExtension extension : parserExtensions) {
940+
parsed = extension.readLocation(location, auths, resolve);
941+
if (parsed.getMessages() != null) {
942+
for (String message : parsed.getMessages()) {
943+
// LOGGER.info("{}: {}", extension, message);
944+
}
945+
}
946+
final OpenAPI result = parsed.getOpenAPI();
947+
if (result != null) {
948+
return result;
949+
}
950+
}
951+
return null;
952+
}
953+
954+
/**
955+
* Tests an NPE when bother the old and new parser are on the classpath. The only way to test this is cloning the
956+
* {@link OpenAPIV3Parser#readContents(String, List, ParseOptions)} to see the NPE when we pass in the extentions. Instead of, for example, mocking the call
957+
* to {@link io.swagger.v3.parser.OpenAPIV3Parser.getExtensions()}.
958+
*/
959+
@Test
960+
public void testIssue2046() {
961+
ParseOptions options = new ParseOptions();
962+
options.setResolve(true);
963+
// This should not throw an NPE:
964+
final OpenAPI openAPI = read("I/do/not/exist/on/the/file/system/I/really/do/not.yaml", null, options, Arrays.asList(new SwaggerConverter()));
965+
Assert.assertNull(openAPI);
966+
}
967+
926968
}

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,10 @@ public OpenAPI read(String location, List<AuthorizationValue> auths, ParseOption
122122
SwaggerParseResult parsed;
123123
for (SwaggerParserExtension extension : parserExtensions) {
124124
parsed = extension.readLocation(location, auths, resolve);
125-
for (String message : parsed.getMessages()) {
126-
LOGGER.info("{}: {}", extension, message);
125+
if (parsed.getMessages() != null) {
126+
for (String message : parsed.getMessages()) {
127+
LOGGER.info("{}: {}", extension, message);
128+
}
127129
}
128130
final OpenAPI result = parsed.getOpenAPI();
129131
if (result != null) {

0 commit comments

Comments
 (0)