Fix NPE in ModelUtils.isFreeFormObject() (#1625)

Fixes #1696

An object schema containing no properties that also has additionalProperties
set to an object schema with no properties will cause
ModelUtils.isFreeFormObject to throw an NPE.
This PR adds additional checking to avoid the NPE.
This commit is contained in:
Phil Adams 2018-12-07 09:16:58 -06:00 committed by William Cheng
parent 2f4bea6967
commit 2d39f14882
2 changed files with 37 additions and 12 deletions

View File

@ -547,20 +547,17 @@ public class ModelUtils {
if ("object".equals(schema.getType())) { if ("object".equals(schema.getType())) {
// no properties // no properties
if ((schema.getProperties() == null || schema.getProperties().isEmpty())) { if ((schema.getProperties() == null || schema.getProperties().isEmpty())) {
if (schema.getAdditionalProperties() == null) { Schema addlProps = getAdditionalProperties(schema);
// additionalProperties not defined
if (addlProps == null) {
return true; return true;
} else { } else {
// additionalProperties set to true if (addlProps instanceof ObjectSchema) {
if (schema.getAdditionalProperties() instanceof Boolean ObjectSchema objSchema = (ObjectSchema) addlProps;
&& (Boolean) schema.getAdditionalProperties()) { // additionalProperties defined as {}
return true; if (objSchema.getProperties() == null || objSchema.getProperties().isEmpty()) {
} return true;
}
// additionalProperties is set to {}
if (schema.getAdditionalProperties() instanceof Schema && schema.getAdditionalProperties() != null
&& schema.getAdditionalProperties() instanceof ObjectSchema
&& ((Schema) schema.getAdditionalProperties()).getProperties().isEmpty()) {
return true;
} }
} }
} }

View File

@ -199,4 +199,32 @@ public class ModelUtilsTest {
Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(allSchemas, refToComposedSchema)); Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(allSchemas, refToComposedSchema));
} }
/**
* Issue https://github.com/OpenAPITools/openapi-generator/issues/1624.
* ModelUtils.isFreeFormObject() should not throw an NPE when passed an empty
* object schema that has additionalProperties defined as an empty object schema.
*/
@Test
public void testIsFreeFormObject() {
// Create initial "empty" object schema.
ObjectSchema objSchema = new ObjectSchema();
Assert.assertTrue(ModelUtils.isFreeFormObject(objSchema));
// Set additionalProperties to an empty ObjectSchema.
objSchema.setAdditionalProperties(new ObjectSchema());
Assert.assertTrue(ModelUtils.isFreeFormObject(objSchema));
// Add a single property to the schema (no longer a free-form object).
Map<String, Schema> props = new HashMap<>();
props.put("prop1", new StringSchema());
objSchema.setProperties(props);
Assert.assertFalse(ModelUtils.isFreeFormObject(objSchema));
// Test a non-object schema
Assert.assertFalse(ModelUtils.isFreeFormObject(new StringSchema()));
// Test a null schema
Assert.assertFalse(ModelUtils.isFreeFormObject(null));
}
} }