From de62b78feca41b5743469eb7bc5f0e437056a9f5 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Thu, 12 Apr 2018 20:58:52 -0500 Subject: [PATCH] fixing issue #684 - added test and solution to avoid NPE --- .../parser/processors/ParameterProcessor.java | 10 +- .../io/swagger/parser/SwaggerParserTest.java | 9 + .../src/test/resources/issue-684.json | 208 ++++++++++++++++++ 3 files changed, 223 insertions(+), 4 deletions(-) create mode 100644 modules/swagger-parser/src/test/resources/issue-684.json diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ParameterProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ParameterProcessor.java index 61f8f37ae6..a8f2d23dca 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ParameterProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ParameterProcessor.java @@ -44,10 +44,12 @@ public List processParameters(List parameters) { // if the parameter exists, replace it boolean matched = false; for(Parameter param : processedPathLevelParameters) { - if(param.getName().equals(resolvedParameter.getName())) { - // ref param wins - matched = true; - break; + if (param.getName() != null) { + if (param.getName().equals(resolvedParameter.getName())) { + // ref param wins + matched = true; + break; + } } } for(Parameter param : parameters) { diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index 1708570b0c..fd340aa831 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -19,6 +19,7 @@ import io.swagger.models.parameters.Parameter; import io.swagger.models.parameters.PathParameter; import io.swagger.models.parameters.QueryParameter; +import io.swagger.models.parameters.RefParameter; import io.swagger.models.parameters.SerializableParameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.ByteArrayProperty; @@ -52,6 +53,14 @@ public class SwaggerParserTest { + @Test + public void testNPEIssue684() throws Exception { + SwaggerParser parser = new SwaggerParser(); + final Swagger swagger = parser.read("src/test/resources/issue-684.json"); + Assert.assertNotNull(swagger); + assertTrue(swagger.getParameters().get("ParamDef3") instanceof RefParameter); + } + @Test public void testRefPaths() throws Exception { String yaml = "swagger: '2.0'\n" + diff --git a/modules/swagger-parser/src/test/resources/issue-684.json b/modules/swagger-parser/src/test/resources/issue-684.json new file mode 100644 index 0000000000..3ca001531b --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-684.json @@ -0,0 +1,208 @@ +{ + "swagger":"2.0", + "info":{ + "title":"swagger_validParameters", + "description":"BuildTookit parameter tests", + "version":"1.0.0" + }, + "host":"api.uber.com", + "schemes":[ + "https" + ], + "basePath":"/basePath", + "produces":[ + "application/json" + ], + "paths":{ + "/path1":{ + "parameters":[ + { + "$ref":"#/parameters/ParamDef1" + }, + { + "$ref":"#/parameters/ParamDef3" + }, + { + "name":"paramDefinedInPath", + "in":"path", + "description":"paramDefinedInPath desc", + "type":"integer", + "format":"int32", + "required":false, + "allowEmptyValue":true + }, + { + "name":"paramDefinedInHeader", + "in":"header", + "description":"paramDefinedInHeader IN Path level", + "type":"integer", + "format":"int32", + "required":false, + "allowEmptyValue":true + }, + { + "name":"paramToBeOverride", + "in":"header", + "description":"paramToBeOverride defined in path level. It will be overridded by parameter in operation level", + "type":"integer", + "format":"int32", + "required":true + }, + { + "name":"optParamToBeOverride", + "in":"header", + "description":"optParamToBeOverride defined in path level. It will be overridded by parameter in operation level", + "type":"integer", + "format":"int32", + "required":true + }, + { + "name":"reqParamToBeOverride", + "in":"header", + "description":"reqParamToBeOverride defined in path level. It will be overridded by parameter in operation level", + "type":"integer", + "format":"int32", + "required":false + } + ], + "post":{ + "parameters":[ + { + "$ref":"#/parameters/ParamDef2" + }, + { + "name":"paramToBeOverride", + "in":"header", + "description":"paramToBeOverride in operation level", + "type":"string", + "required":true + }, + { + "name":"body", + "description":"paramInBody desc", + "required":true, + "in":"body", + "schema":{ + "$ref":"#/definitions/Def1" + } + }, + { + "name":"optParamInPath", + "in":"path", + "description":"optParamInPath desc", + "type":"integer", + "format":"int32", + "required":false, + "allowEmptyValue":true + }, + { + "name":"optParamInHeader", + "in":"header", + "description":"optParamInHeader desc", + "type":"integer", + "format":"int32", + "required":false, + "allowEmptyValue":true + }, + { + "name":"optParamToBeOverride", + "in":"header", + "description":"paramToBeOverride in operation level", + "type":"integer", + "format":"int32", + "required":false + }, + { + "name":"reqParamToBeOverride", + "in":"header", + "description":"paramToBeOverride in operation level", + "type":"integer", + "format":"int32", + "required":true + } + ], + "responses":{ + "200":{ + "headers":{ + "respHeader1":{ + "type":"integer" + } + }, + "schema":{ + "$ref":"#/definitions/Def2" + } + } + } + } + } + }, + "parameters":{ + "ParamDef1":{ + "name":"paramDef1", + "in":"header", + "description":"paramDef1 desc", + "type":"string", + "required":true + }, + "ParamDef2":{ + "name":"paramDef2", + "in":"query", + "description":"paramDef2 desc", + "type":"number", + "required":true + }, + "ParamDef3":{ + "$ref":"#/parameters/ParamDef4" + }, + "ParamDef4":{ + "name":"paramDef4", + "in":"query", + "description":"paramDef4 desc for paramDef3 reference", + "type":"number", + "required":true + } + }, + "definitions":{ + "Def1":{ + "type":"object", + "properties":{ + "def1Prop1":{ + "type":"integer", + "description":"Position in pagination." + } + } + }, + "Def2":{ + "type":"object", + "properties":{ + "def2Prop1":{ + "type":"integer", + "description":"Position in pagination." + }, + "def2Prop2":{ + "type":"array", + "items":{ + "$ref":"#/definitions/Def3" + } + } + } + }, + "Def3":{ + "type":"object", + "properties":{ + "def3Prop1":{ + "type":"string", + "description":"Unique identifier for the activity" + } + } + }, + "Def4":{ + "type":"array", + "items":{ + "$ref":"#/definitions/Def3" + }, + "minItems":1, + "maxItems":100 + } + } +} \ No newline at end of file