diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java index c7a50e3567..3dd49cbde9 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java @@ -2,6 +2,7 @@ import io.swagger.models.*; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.ComposedProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.ObjectProperty; import io.swagger.models.properties.Property; @@ -15,6 +16,8 @@ import org.slf4j.LoggerFactory; import java.net.URI; +import java.util.Arrays; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -131,26 +134,7 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { processDiscriminator(discriminator,modelImpl.getProperties(), file); } - Property additionalProperties = modelImpl.getAdditionalProperties(); - if (additionalProperties != null) { - if (additionalProperties instanceof RefProperty) { - processRefProperty(((RefProperty) additionalProperties), file); - } else if (additionalProperties instanceof ArrayProperty) { - ArrayProperty arrayProp = (ArrayProperty) additionalProperties; - if (arrayProp.getItems() instanceof RefProperty) { - processRefProperty((RefProperty) arrayProp.getItems(), file); - } - } else if (additionalProperties instanceof MapProperty) { - MapProperty mapProp = (MapProperty) additionalProperties; - if (mapProp.getAdditionalProperties() instanceof RefProperty) { - processRefProperty((RefProperty) mapProp.getAdditionalProperties(), file); - } else if (mapProp.getAdditionalProperties() instanceof ArrayProperty && - ((ArrayProperty) mapProp.getAdditionalProperties()).getItems() instanceof RefProperty) { - processRefProperty((RefProperty) ((ArrayProperty) mapProp.getAdditionalProperties()).getItems(), file); - } - } - - } + processProperties(Arrays.asList(modelImpl.getAdditionalProperties()), file); } if (model instanceof ArrayModel && ((ArrayModel) model).getItems() instanceof RefProperty) { processRefProperty((RefProperty) ((ArrayModel) model).getItems(), file); @@ -233,38 +217,27 @@ private void processDiscriminator(String discriminator, Map pr } private void processProperties(final Map subProps, final String file) { - if (subProps == null || 0 == subProps.entrySet().size() ) { + if (subProps == null || subProps.isEmpty()) { return; } - for (Map.Entry prop : subProps.entrySet()) { - if (prop.getValue() instanceof RefProperty) { - processRefProperty((RefProperty) prop.getValue(), file); - } else if (prop.getValue() instanceof ArrayProperty) { - ArrayProperty arrayProp = (ArrayProperty) prop.getValue(); - if (arrayProp.getItems() instanceof RefProperty) { - processRefProperty((RefProperty) arrayProp.getItems(), file); - } - if (arrayProp.getItems() != null){ - if (arrayProp.getItems() instanceof ObjectProperty) { - ObjectProperty objectProperty = (ObjectProperty) arrayProp.getItems(); - processProperties(objectProperty.getProperties(), file); - } - } - } else if (prop.getValue() instanceof MapProperty) { - MapProperty mapProp = (MapProperty) prop.getValue(); - if (mapProp.getAdditionalProperties() instanceof RefProperty) { - processRefProperty((RefProperty) mapProp.getAdditionalProperties(), file); - } else if (mapProp.getAdditionalProperties() instanceof ArrayProperty && - ((ArrayProperty) mapProp.getAdditionalProperties()).getItems() instanceof RefProperty) { - processRefProperty((RefProperty) ((ArrayProperty) mapProp.getAdditionalProperties()).getItems(), - file); - } - } - else if (prop.getValue() instanceof ObjectProperty){ - ObjectProperty objProp = (ObjectProperty) prop.getValue(); - if(objProp.getProperties() != null ){ - processProperties(objProp.getProperties(),file); - } + processProperties(subProps.values(), file); + } + + private void processProperties(final Collection subProps, final String file) { + if (subProps == null || subProps.isEmpty()) { + return; + } + for (Property prop : subProps) { + if (prop instanceof RefProperty) { + processRefProperty((RefProperty) prop, file); + } else if (prop instanceof ArrayProperty) { + processProperties(Arrays.asList(((ArrayProperty) prop).getItems()), file); + } else if (prop instanceof MapProperty) { + processProperties(Arrays.asList(((MapProperty) prop).getAdditionalProperties()), file); + } else if (prop instanceof ObjectProperty) { + processProperties(((ObjectProperty) prop).getProperties(), file); + } else if (prop instanceof ComposedProperty) { + processProperties(((ComposedProperty) prop).getAllOf(), file); } } } diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PropertyProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PropertyProcessor.java index 8da518d86c..2f1431e644 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PropertyProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PropertyProcessor.java @@ -4,6 +4,7 @@ import io.swagger.models.properties.*; import io.swagger.parser.ResolverCache; +import java.util.List; import java.util.Map; import static io.swagger.parser.util.RefUtils.isAnExternalRefFormat; @@ -25,6 +26,8 @@ public void processProperty(Property property) { processMapProperty((MapProperty) property); } else if (property instanceof ObjectProperty) { processObjectProperty((ObjectProperty) property); + } else if (property instanceof ComposedProperty) { + processComposedProperty((ComposedProperty) property); } } @@ -59,4 +62,11 @@ private void processObjectProperty(ObjectProperty property) { for (Property p : properties.values()) processProperty(p); } + + private void processComposedProperty(ComposedProperty property) { + final List properties = property.getAllOf(); + if (properties != null) + for (Property p : properties) + processProperty(p); + } } 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 b1841181b8..83f54e0542 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 @@ -23,6 +23,7 @@ import io.swagger.models.parameters.SerializableParameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.ByteArrayProperty; +import io.swagger.models.properties.ComposedProperty; import io.swagger.models.properties.IntegerProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.ObjectProperty; @@ -1365,6 +1366,21 @@ public void checkAllOfWithRelativeReferencesIssue604() { assertEquals(2, swagger.getDefinitions().size()); } + @Test(description = "Test that validate resolution of external references in allOf of property") + public void checkExtRefResolveInPropertiesWithAllOf() { + Swagger swagger = new SwaggerParser().read("src/test/resources/allOf-property-relative-file-references/parent.yaml"); + assertEquals(2, swagger.getDefinitions().size()); + assertEquals(1, swagger.getDefinitions().get("test").getProperties().size()); + + ComposedProperty property = (ComposedProperty) swagger.getDefinitions().get("test").getProperties().get("property"); + assertEquals(1, property.getVendorExtensions().size()); + assertEquals(1, property.getAllOf().size()); + + RefProperty refProperty = (RefProperty) property.getAllOf().get(0); + assertEquals("#/definitions/def", refProperty.get$ref()); + + } + @Test(description = "A string example should not be over quoted when parsing a yaml string") public void readingSpecStringShouldNotOverQuotingStringExample() throws Exception { SwaggerParser parser = new SwaggerParser(); @@ -1489,4 +1505,4 @@ public void testIssue913() { Assert.assertNotNull(swagger.getDefinitions().get("indicatorType")); Assert.assertEquals(swagger.getDefinitions().get("indicatorType").getProperties().size(),1); } -} \ No newline at end of file +} diff --git a/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/child.yaml b/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/child.yaml new file mode 100644 index 0000000000..e1b9b5c945 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/child.yaml @@ -0,0 +1,14 @@ +swagger: '2.0' + +info: + version: "0.0.1" + title: Devices API + +basePath: /api/v2/devices + +definitions: + def: + type: object + properties: + name: + type: string \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/parent.yaml b/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/parent.yaml new file mode 100644 index 0000000000..c9fc714bd1 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-property-relative-file-references/parent.yaml @@ -0,0 +1,16 @@ +swagger: '2.0' + +info: + version: "0.0.1" + title: Devices API + +basePath: /api/v2/devices + +definitions: + test: + type: object + properties: + property: + x-attr: "value" + allOf: + - $ref: "./child.yaml#/definitions/def" \ No newline at end of file