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 c00f525cc5..4dfa107c5f 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 @@ -92,31 +92,14 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { } else { processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE); } + } else if (allOfModel instanceof ModelImpl) { + //Loop through additional properties of allOf and recursively call this method; + processProperties(allOfModel.getProperties(), file); } } } //Loop the properties and recursively call this method; - Map subProps = model.getProperties(); - if (subProps != null) { - 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); - } - } 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); - } - } - } - } + processProperties(model.getProperties(), file); if (model instanceof ModelImpl) { ModelImpl modelImpl = (ModelImpl) model; Property additionalProperties = modelImpl.getAdditionalProperties(); @@ -148,6 +131,31 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { return newRef; } + private void processProperties(final Map subProps, final String file) { + if (subProps == null || 0 == subProps.entrySet().size() ) { + 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); + } + } 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); + } + } + } + } + private void processRefProperty(RefProperty subRef, String externalFile) { if (isAnExternalRefFormat(subRef.getRefFormat())) { String $ref = constructRef(subRef, externalFile); diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java index e878f240fb..2bb38f72d9 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java @@ -70,7 +70,7 @@ public static String readExternalUrlRef(String file, RefFormat refFormat, List props = composedModel.getChild().getProperties(); + assertEquals(((RefProperty) props.get("mother")).getSimpleRef(), "pet"); + assertEquals(((RefProperty) ((ArrayProperty) props.get("siblings")).getItems()).getSimpleRef(), "pet"); + } } } diff --git a/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/pet.json b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/pet.json new file mode 100644 index 0000000000..c6a4eae7f1 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/pet.json @@ -0,0 +1,8 @@ +{ + "type": "object", + "properties": { + "color": { + "type": "string" + } + } +} diff --git a/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/purebred_pet.json b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/purebred_pet.json new file mode 100644 index 0000000000..c1f9b469b0 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/purebred_pet.json @@ -0,0 +1,25 @@ +{ + "allOf": [ + { + "$ref": "./pet.json" + }, + { + "type": "object", + "properties": { + "breed": { + "type": "string", + "sample": "Labrador" + }, + "mother": { + "$ref": "./pet.json" + }, + "siblings": { + "type": "array", + "items": { + "$ref": "./pet.json" + } + } + } + } + ] +} diff --git a/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/swagger.json b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/swagger.json new file mode 100644 index 0000000000..80d9cba1e9 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/models/swagger.json @@ -0,0 +1,12 @@ +{ + "swagger": "2.0", + "info": { + "title": "flat", + "version": "1.0.0" + }, + "definitions": { + "record": { + "$ref": "./purebred_pet.json" + } + } +} \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/swagger.json b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/swagger.json new file mode 100644 index 0000000000..fb82fd3455 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-properties-ext-ref/swagger.json @@ -0,0 +1,12 @@ +{ + "swagger": "2.0", + "info": { + "title": "flat", + "version": "1.0.0" + }, + "definitions": { + "record": { + "$ref": "./models/purebred_pet.json" + } + } +} \ No newline at end of file