Skip to content

Commit ccdb9eb

Browse files
authored
Merge pull request #944 from Tiller/v1
Integrated ComposedProperty into the parser/resolver
2 parents dc6753a + 5ffaa04 commit ccdb9eb

File tree

5 files changed

+80
-51
lines changed

5 files changed

+80
-51
lines changed

modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.swagger.models.*;
44
import io.swagger.models.properties.ArrayProperty;
5+
import io.swagger.models.properties.ComposedProperty;
56
import io.swagger.models.properties.MapProperty;
67
import io.swagger.models.properties.ObjectProperty;
78
import io.swagger.models.properties.Property;
@@ -15,6 +16,8 @@
1516
import org.slf4j.LoggerFactory;
1617

1718
import java.net.URI;
19+
import java.util.Arrays;
20+
import java.util.Collection;
1821
import java.util.LinkedHashMap;
1922
import java.util.List;
2023
import java.util.Map;
@@ -131,26 +134,7 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) {
131134
processDiscriminator(discriminator,modelImpl.getProperties(), file);
132135
}
133136

134-
Property additionalProperties = modelImpl.getAdditionalProperties();
135-
if (additionalProperties != null) {
136-
if (additionalProperties instanceof RefProperty) {
137-
processRefProperty(((RefProperty) additionalProperties), file);
138-
} else if (additionalProperties instanceof ArrayProperty) {
139-
ArrayProperty arrayProp = (ArrayProperty) additionalProperties;
140-
if (arrayProp.getItems() instanceof RefProperty) {
141-
processRefProperty((RefProperty) arrayProp.getItems(), file);
142-
}
143-
} else if (additionalProperties instanceof MapProperty) {
144-
MapProperty mapProp = (MapProperty) additionalProperties;
145-
if (mapProp.getAdditionalProperties() instanceof RefProperty) {
146-
processRefProperty((RefProperty) mapProp.getAdditionalProperties(), file);
147-
} else if (mapProp.getAdditionalProperties() instanceof ArrayProperty &&
148-
((ArrayProperty) mapProp.getAdditionalProperties()).getItems() instanceof RefProperty) {
149-
processRefProperty((RefProperty) ((ArrayProperty) mapProp.getAdditionalProperties()).getItems(), file);
150-
}
151-
}
152-
153-
}
137+
processProperties(Arrays.asList(modelImpl.getAdditionalProperties()), file);
154138
}
155139
if (model instanceof ArrayModel && ((ArrayModel) model).getItems() instanceof RefProperty) {
156140
processRefProperty((RefProperty) ((ArrayModel) model).getItems(), file);
@@ -233,38 +217,27 @@ private void processDiscriminator(String discriminator, Map<String, Property> pr
233217
}
234218

235219
private void processProperties(final Map<String, Property> subProps, final String file) {
236-
if (subProps == null || 0 == subProps.entrySet().size() ) {
220+
if (subProps == null || subProps.isEmpty()) {
237221
return;
238222
}
239-
for (Map.Entry<String, Property> prop : subProps.entrySet()) {
240-
if (prop.getValue() instanceof RefProperty) {
241-
processRefProperty((RefProperty) prop.getValue(), file);
242-
} else if (prop.getValue() instanceof ArrayProperty) {
243-
ArrayProperty arrayProp = (ArrayProperty) prop.getValue();
244-
if (arrayProp.getItems() instanceof RefProperty) {
245-
processRefProperty((RefProperty) arrayProp.getItems(), file);
246-
}
247-
if (arrayProp.getItems() != null){
248-
if (arrayProp.getItems() instanceof ObjectProperty) {
249-
ObjectProperty objectProperty = (ObjectProperty) arrayProp.getItems();
250-
processProperties(objectProperty.getProperties(), file);
251-
}
252-
}
253-
} else if (prop.getValue() instanceof MapProperty) {
254-
MapProperty mapProp = (MapProperty) prop.getValue();
255-
if (mapProp.getAdditionalProperties() instanceof RefProperty) {
256-
processRefProperty((RefProperty) mapProp.getAdditionalProperties(), file);
257-
} else if (mapProp.getAdditionalProperties() instanceof ArrayProperty &&
258-
((ArrayProperty) mapProp.getAdditionalProperties()).getItems() instanceof RefProperty) {
259-
processRefProperty((RefProperty) ((ArrayProperty) mapProp.getAdditionalProperties()).getItems(),
260-
file);
261-
}
262-
}
263-
else if (prop.getValue() instanceof ObjectProperty){
264-
ObjectProperty objProp = (ObjectProperty) prop.getValue();
265-
if(objProp.getProperties() != null ){
266-
processProperties(objProp.getProperties(),file);
267-
}
223+
processProperties(subProps.values(), file);
224+
}
225+
226+
private void processProperties(final Collection<Property> subProps, final String file) {
227+
if (subProps == null || subProps.isEmpty()) {
228+
return;
229+
}
230+
for (Property prop : subProps) {
231+
if (prop instanceof RefProperty) {
232+
processRefProperty((RefProperty) prop, file);
233+
} else if (prop instanceof ArrayProperty) {
234+
processProperties(Arrays.asList(((ArrayProperty) prop).getItems()), file);
235+
} else if (prop instanceof MapProperty) {
236+
processProperties(Arrays.asList(((MapProperty) prop).getAdditionalProperties()), file);
237+
} else if (prop instanceof ObjectProperty) {
238+
processProperties(((ObjectProperty) prop).getProperties(), file);
239+
} else if (prop instanceof ComposedProperty) {
240+
processProperties(((ComposedProperty) prop).getAllOf(), file);
268241
}
269242
}
270243
}

modules/swagger-parser/src/main/java/io/swagger/parser/processors/PropertyProcessor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.swagger.models.properties.*;
55
import io.swagger.parser.ResolverCache;
66

7+
import java.util.List;
78
import java.util.Map;
89

910
import static io.swagger.parser.util.RefUtils.isAnExternalRefFormat;
@@ -25,6 +26,8 @@ public void processProperty(Property property) {
2526
processMapProperty((MapProperty) property);
2627
} else if (property instanceof ObjectProperty) {
2728
processObjectProperty((ObjectProperty) property);
29+
} else if (property instanceof ComposedProperty) {
30+
processComposedProperty((ComposedProperty) property);
2831
}
2932
}
3033

@@ -59,4 +62,11 @@ private void processObjectProperty(ObjectProperty property) {
5962
for (Property p : properties.values())
6063
processProperty(p);
6164
}
65+
66+
private void processComposedProperty(ComposedProperty property) {
67+
final List<Property> properties = property.getAllOf();
68+
if (properties != null)
69+
for (Property p : properties)
70+
processProperty(p);
71+
}
6272
}

modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.swagger.models.parameters.SerializableParameter;
2424
import io.swagger.models.properties.ArrayProperty;
2525
import io.swagger.models.properties.ByteArrayProperty;
26+
import io.swagger.models.properties.ComposedProperty;
2627
import io.swagger.models.properties.IntegerProperty;
2728
import io.swagger.models.properties.MapProperty;
2829
import io.swagger.models.properties.ObjectProperty;
@@ -1365,6 +1366,21 @@ public void checkAllOfWithRelativeReferencesIssue604() {
13651366
assertEquals(2, swagger.getDefinitions().size());
13661367
}
13671368

1369+
@Test(description = "Test that validate resolution of external references in allOf of property")
1370+
public void checkExtRefResolveInPropertiesWithAllOf() {
1371+
Swagger swagger = new SwaggerParser().read("src/test/resources/allOf-property-relative-file-references/parent.yaml");
1372+
assertEquals(2, swagger.getDefinitions().size());
1373+
assertEquals(1, swagger.getDefinitions().get("test").getProperties().size());
1374+
1375+
ComposedProperty property = (ComposedProperty) swagger.getDefinitions().get("test").getProperties().get("property");
1376+
assertEquals(1, property.getVendorExtensions().size());
1377+
assertEquals(1, property.getAllOf().size());
1378+
1379+
RefProperty refProperty = (RefProperty) property.getAllOf().get(0);
1380+
assertEquals("#/definitions/def", refProperty.get$ref());
1381+
1382+
}
1383+
13681384
@Test(description = "A string example should not be over quoted when parsing a yaml string")
13691385
public void readingSpecStringShouldNotOverQuotingStringExample() throws Exception {
13701386
SwaggerParser parser = new SwaggerParser();
@@ -1489,4 +1505,4 @@ public void testIssue913() {
14891505
Assert.assertNotNull(swagger.getDefinitions().get("indicatorType"));
14901506
Assert.assertEquals(swagger.getDefinitions().get("indicatorType").getProperties().size(),1);
14911507
}
1492-
}
1508+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
swagger: '2.0'
2+
3+
info:
4+
version: "0.0.1"
5+
title: Devices API
6+
7+
basePath: /api/v2/devices
8+
9+
definitions:
10+
def:
11+
type: object
12+
properties:
13+
name:
14+
type: string
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
swagger: '2.0'
2+
3+
info:
4+
version: "0.0.1"
5+
title: Devices API
6+
7+
basePath: /api/v2/devices
8+
9+
definitions:
10+
test:
11+
type: object
12+
properties:
13+
property:
14+
x-attr: "value"
15+
allOf:
16+
- $ref: "./child.yaml#/definitions/def"

0 commit comments

Comments
 (0)