Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,27 @@ private static List<String> getEnum(JsonNode node, PropertyBuilder.PropertyId ty
return result.isEmpty() ? null : result;
}

//because of the complexity of deserializing properties we must handle vendor extensions by hand
private static Map<String, Object> getVendorExtensions(JsonNode node) {

Map result = new HashMap<String, Object>();

Iterator<String> fieldNameIter = node.fieldNames();
while (fieldNameIter.hasNext()) {
String fieldName = fieldNameIter.next();

if(fieldName.startsWith("x-")) {
JsonNode extensionField = node.get(fieldName);

Object extensionObject = Json.mapper().convertValue(extensionField, Object.class);
result.put(fieldName, extensionObject);
}

}

return result;
}

private static JsonNode getDetailNode(JsonNode node, PropertyBuilder.PropertyId type) {
return node.get(type.getPropertyName());
}
Expand Down Expand Up @@ -170,6 +191,7 @@ Property propertyFromNode(JsonNode node) {
args.put(PropertyBuilder.PropertyId.EXCLUSIVE_MAXIMUM, getBoolean(node, PropertyBuilder.PropertyId.EXCLUSIVE_MAXIMUM));
args.put(PropertyBuilder.PropertyId.UNIQUE_ITEMS, getBoolean(node, PropertyBuilder.PropertyId.UNIQUE_ITEMS));
args.put(PropertyBuilder.PropertyId.READ_ONLY, getBoolean(node, PropertyBuilder.PropertyId.READ_ONLY));
args.put(PropertyBuilder.PropertyId.VENDOR_EXTENSIONS, getVendorExtensions(node));

Property output = PropertyBuilder.build(type, format, args);
if (output == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,42 @@ public void testDeserializeSecurityRequirement() throws Exception {
assertEquals(oauth2.get(1), "world");
}
}

@Test (description = "should deserialize a property with vendor extensions of different types")
public void testDeserializePropertyWithVendorExtensions() throws Exception {

Swagger swagger = TestUtils.deserializeJsonFileFromClasspath("specFiles/propertyWithVendorExtensions.json", Swagger.class);

Map<String, Object> vendorExtensions = swagger.getDefinitions().get("Health").getProperties().get("status").getVendorExtensions();

assertNotNull(vendorExtensions);
assertEquals(6, vendorExtensions.size());

String xStringValue = (String) vendorExtensions.get("x-string-value");
assertNotNull(xStringValue);
assertEquals(xStringValue, "Hello World");

assertTrue(vendorExtensions.containsKey("x-null-value"));
assertNull(vendorExtensions.get("x-null-value"));

Map<String, String> xMapValue = (Map) vendorExtensions.get("x-map-value");
assertNotNull(xMapValue);
assertEquals(xMapValue.get("hello"), "world");
assertEquals(xMapValue.get("foo"), "bar");

List<String> xListValue = (List) vendorExtensions.get("x-list-value");
assertNotNull(xListValue);
assertEquals(xListValue.get(0), "Hello");
assertEquals(xListValue.get(1), "World");

Integer xNumberValue = (Integer) vendorExtensions.get("x-number-value");
assertNotNull(xNumberValue);
assertEquals(xNumberValue.intValue(), 123);

Boolean xBooleanValue = (Boolean) vendorExtensions.get("x-boolean-value");
assertNotNull(xBooleanValue);
assertTrue(xBooleanValue);

assertFalse(vendorExtensions.containsKey("not-an-extension"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"swagger": "2.0",
"paths": {
"/health": {
"get": {
"responses": {
"200": {
"description": "Success",
"schema": {
"$ref": "#/definitions/Health"
}
}
}
}
}
},
"definitions": {
"Health": {
"properties": {
"status": {
"type": "string",
"x-string-value": "Hello World",
"x-null-value": null,
"x-map-value": {
"hello": "world",
"foo": "bar"
},
"x-list-value": [
"Hello", "World"
],
"x-number-value": 123,
"x-boolean-value": true,
"not-an-extension": "foobar"
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ public interface Model {
void setReference(String reference);

Object clone();

Map<String, Object> getVendorExtensions();
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ public Object clone() {
return cloned;
}

@Override
@JsonIgnore
public Map<String, Object> getVendorExtensions() {
return null;
}

@Override
public int hashCode() {
final int prime = 31;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ public void setVendorExtension(String name, Object value) {
}
}

public void setVendorExtensionMap(Map<String, Object> vendorExtensionMap) {
this.vendorExtensions.putAll(vendorExtensionMap);
}

@Override
public int hashCode() {
final int prime = 31;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.models.Xml;

import java.util.Map;

public interface Property {
Property title(String title);

Expand Down Expand Up @@ -53,4 +55,6 @@ public interface Property {

@JsonIgnore
void setAccess(String access);

Map<String, Object> getVendorExtensions();
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ public enum PropertyId {
EXAMPLE("example"),
TYPE("type"),
FORMAT("format"),
READ_ONLY("readOnly");
READ_ONLY("readOnly"),
VENDOR_EXTENSIONS("vendorExtensions");

private String propertyName;

Expand Down Expand Up @@ -716,6 +717,10 @@ public Property merge(Property property, Map<PropertyId, Object> args) {
final String value = PropertyId.EXAMPLE.findValue(args);
resolved.setExample(value);
}
if(args.containsKey(PropertyId.VENDOR_EXTENSIONS)) {
final Map<String, Object> value = PropertyId.VENDOR_EXTENSIONS.findValue(args);
resolved.setVendorExtensionMap(value);
}
}
return property;
}
Expand Down