From bcd0363c8c160b9dc39f26ff94f3ab004f139cf4 Mon Sep 17 00:00:00 2001 From: hong-ubuntu Date: Sun, 7 Nov 2021 17:30:15 -0600 Subject: [PATCH 1/4] try to catch NullPointerException and print error message --- .../openapitools/codegen/config/CodegenConfigurator.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index 01302ab1dcd1..0c8c3eaa1626 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -520,7 +520,14 @@ public Context toContext() { final List authorizationValues = AuthParser.parse(this.auth); ParseOptions options = new ParseOptions(); options.setResolve(true); - SwaggerParseResult result = new OpenAPIParser().readLocation(inputSpec, authorizationValues, options); + + SwaggerParseResult result = new SwaggerParseResult(); + try{ + result = new OpenAPIParser().readLocation(inputSpec, authorizationValues, options); + } catch (NullPointerException e) { + System.err.println("[error] There is an error parsing the input spec file: " + inputSpec); + System.err.println("[error] Please make sure the spec file has correct format and all required fields are populated."); + } // TODO: Move custom validations to a separate type as part of a "Workflow" Set validationMessages = new HashSet<>(null != result.getMessages() ? result.getMessages() : new ArrayList<>()); From 4bab92c4e6666c19aabd350b8769691379028b74 Mon Sep 17 00:00:00 2001 From: hong-ubuntu Date: Tue, 9 Nov 2021 21:32:55 -0600 Subject: [PATCH 2/4] handles invalid specifications when the spec file is invalid --- .../codegen/config/CodegenConfigurator.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index 0c8c3eaa1626..1b8b78299ffe 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -521,13 +521,7 @@ public Context toContext() { ParseOptions options = new ParseOptions(); options.setResolve(true); - SwaggerParseResult result = new SwaggerParseResult(); - try{ - result = new OpenAPIParser().readLocation(inputSpec, authorizationValues, options); - } catch (NullPointerException e) { - System.err.println("[error] There is an error parsing the input spec file: " + inputSpec); - System.err.println("[error] Please make sure the spec file has correct format and all required fields are populated."); - } + SwaggerParseResult result = new OpenAPIParser().readLocation(inputSpec, authorizationValues, options); // TODO: Move custom validations to a separate type as part of a "Workflow" Set validationMessages = new HashSet<>(null != result.getMessages() ? result.getMessages() : new ArrayList<>()); @@ -541,9 +535,14 @@ public Context toContext() { if (validationMessages.size() > 0) { Set warnings = new HashSet<>(); if (specification != null) { - List unusedModels = ModelUtils.getUnusedSchemas(specification); - if (unusedModels != null) { - unusedModels.forEach(name -> warnings.add("Unused model: " + name)); + try{ + List unusedModels = ModelUtils.getUnusedSchemas(specification); + if (unusedModels != null) { + unusedModels.forEach(name -> warnings.add("Unused model: " + name)); + } + } catch (Exception e){ + System.err.println("[error] There is an error with OpenAPI specification parsed from the input spec file: " + inputSpec); + System.err.println("[error] Please make sure the spec file has correct format and all required fields are populated with valid value."); } } From cc63a73aa278f3ace925ad4cf0bda585816564fb Mon Sep 17 00:00:00 2001 From: hong-ubuntu Date: Tue, 16 Nov 2021 22:37:11 -0600 Subject: [PATCH 3/4] added comment --- .../org/openapitools/codegen/config/CodegenConfigurator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index 0db8c26b7c02..b5bd0b23c332 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -534,6 +534,9 @@ public Context toContext() { if (validationMessages.size() > 0) { Set warnings = new HashSet<>(); if (specification != null) { + + // Wrap the getUnusedSchemas() in try catch block so it catches the NPE + // when the input spec file is not correct try{ List unusedModels = ModelUtils.getUnusedSchemas(specification); if (unusedModels != null) { From e9dd6a9855bd9a4f084624de79d0c09747e1732d Mon Sep 17 00:00:00 2001 From: hong-ubuntu Date: Sat, 20 Nov 2021 16:58:55 -0600 Subject: [PATCH 4/4] added null pointer exception test --- .../org/openapitools/codegen/cmd/GenerateTest.java | 10 ++++++++++ .../src/test/resources/npe-test-spec-file.yaml | 14 ++++++++++++++ .../src/test/resources/npe-test.yaml | 8 ++++++++ 3 files changed, 32 insertions(+) create mode 100644 modules/openapi-generator-cli/src/test/resources/npe-test-spec-file.yaml create mode 100644 modules/openapi-generator-cli/src/test/resources/npe-test.yaml diff --git a/modules/openapi-generator-cli/src/test/java/org/openapitools/codegen/cmd/GenerateTest.java b/modules/openapi-generator-cli/src/test/java/org/openapitools/codegen/cmd/GenerateTest.java index 496e078a15d6..5b0130067398 100644 --- a/modules/openapi-generator-cli/src/test/java/org/openapitools/codegen/cmd/GenerateTest.java +++ b/modules/openapi-generator-cli/src/test/java/org/openapitools/codegen/cmd/GenerateTest.java @@ -22,7 +22,9 @@ import org.mockito.MockSettings; import org.openapitools.codegen.DefaultGenerator; import org.openapitools.codegen.Generator; +import org.openapitools.codegen.SpecValidationException; import org.openapitools.codegen.config.CodegenConfigurator; +import org.testng.TestException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -430,4 +432,12 @@ public void testVerboseShort() { verify(configurator).toContext(); verifyNoMoreInteractions(configurator); } + + /** + * This test ensures that when the + */ + @Test(expectedExceptions = SpecValidationException.class) + public void testNPEWithInvalidSpecFile() { + setupAndRunTest("-i", "src/test/resources/npe-test.yaml", "-g", "java", "-o", "src/main/java", false, null); + } } diff --git a/modules/openapi-generator-cli/src/test/resources/npe-test-spec-file.yaml b/modules/openapi-generator-cli/src/test/resources/npe-test-spec-file.yaml new file mode 100644 index 000000000000..3e2a60862c98 --- /dev/null +++ b/modules/openapi-generator-cli/src/test/resources/npe-test-spec-file.yaml @@ -0,0 +1,14 @@ +test: + get: + responses: + '200': + description: test + content: + application/json: + schema: + type: object + properties: + prop1: + type: array + prop2: + type: date \ No newline at end of file diff --git a/modules/openapi-generator-cli/src/test/resources/npe-test.yaml b/modules/openapi-generator-cli/src/test/resources/npe-test.yaml new file mode 100644 index 000000000000..11fc1eff666a --- /dev/null +++ b/modules/openapi-generator-cli/src/test/resources/npe-test.yaml @@ -0,0 +1,8 @@ +openapi: 3.0.0 +info: + description: test + version: test + title: test +paths: + /test: + $ref: 'npe-test-spec-file.yaml#/test' \ No newline at end of file