Skip to content

Commit

Permalink
Merge pull request #368 from swagger-api/bool-additional-props
Browse files Browse the repository at this point in the history
fix handling of boolean additionalProperties
  • Loading branch information
frantuma authored Apr 24, 2019
2 parents 8d2b70d + b95c29b commit deb1139
Show file tree
Hide file tree
Showing 16 changed files with 148 additions and 37 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,8 @@
</dependencies>
<properties>
<swagger-codegen-version>3.0.8-SNAPSHOT</swagger-codegen-version>
<swagger-parser-version>2.0.11</swagger-parser-version>
<swagger-core-version>2.0.7</swagger-core-version>
<swagger-parser-version>2.0.12-SNAPSHOT</swagger-parser-version>
<swagger-core-version>2.0.8-SNAPSHOT</swagger-core-version>
<jackson-version>2.9.8</jackson-version>
<scala-version>2.11.1</scala-version>
<felix-version>3.3.0</felix-version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,7 @@ else if (Parameter.StyleEnum.SPACEDELIMITED.equals(queryParameter.getStyle())) {
* @return string presentation of the instantiation type of the property
*/
public String toInstantiationType(Schema property) {
if (property instanceof MapSchema || (property.getAdditionalProperties() != null && (property.getAdditionalProperties() instanceof Schema))) {
if (property instanceof MapSchema && hasSchemaProperties(property)) {
Schema additionalProperties = (Schema) property.getAdditionalProperties();
String type = additionalProperties.getType();
if (null == type) {
Expand All @@ -955,6 +955,9 @@ public String toInstantiationType(Schema property) {
}
String inner = getSchemaType(additionalProperties);
return instantiationTypes.get("map") + "<String, " + inner + ">";
} else if (property instanceof MapSchema && hasTrueAdditionalProperties(property)) {
String inner = getSchemaType(new ObjectSchema());
return instantiationTypes.get("map") + "<String, " + inner + ">";
} else if (property instanceof ArraySchema) {
ArraySchema arraySchema = (ArraySchema) property;
String inner = getSchemaType(arraySchema.getItems());
Expand Down Expand Up @@ -1072,7 +1075,7 @@ private static String getTypeOfSchema(Schema schema) {
return "string";
} else {
if (schema != null) {
if (SchemaTypeUtil.OBJECT_TYPE.equals(schema.getType()) && schema.getAdditionalProperties() != null && (schema.getAdditionalProperties() instanceof Schema)) {
if (SchemaTypeUtil.OBJECT_TYPE.equals(schema.getType()) && (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema))) {
return "map";
} else {
return schema.getType();
Expand Down Expand Up @@ -1257,6 +1260,10 @@ else if (schema instanceof MapSchema) {
codegenModel.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
codegenModel.getVendorExtensions().put(IS_CONTAINER_EXT_NAME, Boolean.TRUE);
addParentContainer(codegenModel, name, schema);
if (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema)) {
addAdditionPropertiesToCodeGenModel(codegenModel, schema);
}

}
else if (schema instanceof ComposedSchema) {
final ComposedSchema composed = (ComposedSchema) schema;
Expand Down Expand Up @@ -1350,9 +1357,6 @@ else if (schema instanceof ComposedSchema) {
codegenModel.allowableValues = new HashMap<String, Object>();
codegenModel.allowableValues.put("values", schema.getEnum());
}
if (schema.getAdditionalProperties() != null && (schema.getAdditionalProperties() instanceof Schema)) {
addAdditionPropertiesToCodeGenModel(codegenModel, schema);
}
addVars(codegenModel, schema.getProperties(), schema.getRequired());
}

Expand Down Expand Up @@ -1671,7 +1675,7 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) {
Schema items = ((ArraySchema) propertySchema).getItems();
CodegenProperty innerCodegenProperty = fromProperty(itemName, items);
updatePropertyForArray(codegenProperty, innerCodegenProperty);
} else if (propertySchema instanceof MapSchema || ((propertySchema.getAdditionalProperties() != null && (propertySchema.getAdditionalProperties() instanceof Schema)))) {
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {

codegenProperty.getVendorExtensions().put(CodegenConstants.IS_CONTAINER_EXT_NAME, Boolean.TRUE);
codegenProperty.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
Expand All @@ -1683,6 +1687,18 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) {
// handle inner property
CodegenProperty cp = fromProperty("inner", (Schema) propertySchema.getAdditionalProperties());
updatePropertyForMap(codegenProperty, cp);
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {

codegenProperty.getVendorExtensions().put(CodegenConstants.IS_CONTAINER_EXT_NAME, Boolean.TRUE);
codegenProperty.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
codegenProperty.containerType = "map";
codegenProperty.baseType = getSchemaType(propertySchema);
codegenProperty.minItems = propertySchema.getMinProperties();
codegenProperty.maxItems = propertySchema.getMaxProperties();

// handle inner property
CodegenProperty cp = fromProperty("inner", new ObjectSchema());
updatePropertyForMap(codegenProperty, cp);
} else {
setNonArrayMapProperty(codegenProperty, type);
}
Expand Down Expand Up @@ -1931,10 +1947,13 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
ArraySchema arraySchema = (ArraySchema) responseSchema;
CodegenProperty innerProperty = fromProperty("response", arraySchema.getItems());
codegenOperation.returnBaseType = innerProperty.baseType;
} else if (responseSchema instanceof MapSchema) {
} else if (responseSchema instanceof MapSchema && hasSchemaProperties(responseSchema)) {
MapSchema mapSchema = (MapSchema) responseSchema;
CodegenProperty innerProperty = fromProperty("response", (Schema) mapSchema.getAdditionalProperties());
codegenOperation.returnBaseType = innerProperty.baseType;
} else if (responseSchema instanceof MapSchema && hasTrueAdditionalProperties(responseSchema)) {
CodegenProperty innerProperty = fromProperty("response", new ObjectSchema());
codegenOperation.returnBaseType = innerProperty.baseType;
} else {
if (codegenProperty.complexType != null) {
codegenOperation.returnBaseType = codegenProperty.complexType;
Expand Down Expand Up @@ -2329,7 +2348,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports)
imports.add(codegenProperty.baseType);
codegenProperty = codegenProperty.items;
}
} else if (parameterSchema instanceof MapSchema) { // for map parameter
} else if (parameterSchema instanceof MapSchema && hasSchemaProperties(parameterSchema)) { // for map parameter
CodegenProperty codegenProperty = fromProperty("inner", (Schema) parameterSchema.getAdditionalProperties());
codegenParameter.items = codegenProperty;
codegenParameter.baseType = codegenProperty.datatype;
Expand All @@ -2341,6 +2360,18 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports)
codegenProperty = codegenProperty.items;
}
collectionFormat = getCollectionFormat(parameter);
} else if (parameterSchema instanceof MapSchema && hasTrueAdditionalProperties(parameterSchema)) { // for map parameter
CodegenProperty codegenProperty = fromProperty("inner", new ObjectSchema());
codegenParameter.items = codegenProperty;
codegenParameter.baseType = codegenProperty.datatype;
codegenParameter.getVendorExtensions().put(CodegenConstants.IS_CONTAINER_EXT_NAME, Boolean.TRUE);
codegenParameter.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
// recursively add import
while (codegenProperty != null) {
imports.add(codegenProperty.baseType);
codegenProperty = codegenProperty.items;
}
collectionFormat = getCollectionFormat(parameter);
} else if (parameterSchema instanceof FileSchema) {
codegenParameter.getVendorExtensions().put(CodegenConstants.IS_FILE_EXT_NAME, Boolean.TRUE);
}
Expand Down Expand Up @@ -4047,6 +4078,11 @@ protected static boolean hasSchemaProperties(Schema schema) {
return additionalProperties != null && additionalProperties instanceof Schema;
}

protected static boolean hasTrueAdditionalProperties(Schema schema) {
final Object additionalProperties = schema.getAdditionalProperties();
return additionalProperties != null && Boolean.TRUE.equals(additionalProperties);
}

protected void configuresParameterForMediaType(CodegenOperation codegenOperation, List<CodegenContent> codegenContents) {
if (codegenContents.isEmpty()) {
CodegenContent content = new CodegenContent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.swagger.v3.oas.models.media.DateSchema;
import io.swagger.v3.oas.models.media.DateTimeSchema;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.Parameter;
Expand Down Expand Up @@ -785,7 +786,11 @@ public String getTypeDeclaration(Schema propertySchema) {
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
Schema inner = (Schema) propertySchema.getAdditionalProperties();
return String.format("%s<string, %s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return String.format("%s<string, %s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
}

return super.getTypeDeclaration(propertySchema);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -122,9 +123,12 @@ public String getTypeDeclaration(Schema propertySchema) {
Schema inner = ((ArraySchema) propertySchema).getItems();
return String.format("%s[%s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
}
else if (propertySchema instanceof MapSchema && propertySchema.getAdditionalProperties() instanceof Schema) {
else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
Schema inner = (Schema) propertySchema.getAdditionalProperties();
return String.format("%s[String, %s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return String.format("%s[String, %s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
}
return super.getTypeDeclaration(propertySchema);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.StringUtils;

Expand Down Expand Up @@ -105,9 +106,12 @@ public String getTypeDeclaration(Schema propertySchema) {
Schema inner = ((ArraySchema) propertySchema).getItems();
return String.format("%s[%s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
}
else if (propertySchema instanceof MapSchema) {
else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
Schema inner = (Schema) propertySchema.getAdditionalProperties();
return String.format("%s[String, %s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return String.format("%s[String, %s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
}
return super.getTypeDeclaration(propertySchema);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.swagger.v3.oas.models.media.IntegerSchema;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.NumberSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.responses.ApiResponse;
Expand Down Expand Up @@ -653,14 +654,17 @@ public String getTypeDeclaration(Schema propertySchema) {
}
return String.format("%s<%s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
// return getSwaggerType(propertySchema) + "<" + getTypeDeclaration(inner) + ">";
} else if (propertySchema instanceof MapSchema || propertySchema.getAdditionalProperties() != null) {
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
Schema inner = (Schema) propertySchema.getAdditionalProperties();
if (inner == null) {
LOGGER.warn(propertySchema.getName() + "(map property) does not have a proper inner type defined");
// TODO maybe better defaulting to StringProperty than returning null
return null;
}
return getSchemaType(propertySchema) + "<String, " + getTypeDeclaration(inner) + ">";
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return getSchemaType(propertySchema) + "<String, " + getTypeDeclaration(inner) + ">";
}
return super.getTypeDeclaration(propertySchema);
}
Expand Down Expand Up @@ -697,7 +701,7 @@ public String toDefaultValue(Schema schema) {
}

return String.format(pattern, typeDeclaration);
} else if (schema instanceof MapSchema || (schema.getAdditionalProperties() != null && (schema.getAdditionalProperties() instanceof Schema))) {
} else if (schema instanceof MapSchema && hasSchemaProperties(schema)) {
final String pattern;
if (fullJavaUtil) {
pattern = "new java.util.HashMap<%s>()";
Expand All @@ -717,6 +721,27 @@ public String toDefaultValue(Schema schema) {
}
}

return String.format(pattern, typeDeclaration);
} else if (schema instanceof MapSchema && hasTrueAdditionalProperties(schema)) {
final String pattern;
if (fullJavaUtil) {
pattern = "new java.util.HashMap<%s>()";
} else {
pattern = "new HashMap<%s>()";
}
if (schema.getAdditionalProperties() == null) {
return null;
}
Schema inner = new ObjectSchema();
String typeDeclaration = String.format("String, %s", getTypeDeclaration(inner));
Object java8obj = additionalProperties.get("java8");
if (java8obj != null) {
Boolean java8 = Boolean.valueOf(java8obj.toString());
if (java8 != null && java8) {
typeDeclaration = "";
}
}

return String.format(pattern, typeDeclaration);
} else if (schema instanceof IntegerSchema) {
if (schema.getDefault() != null && SchemaTypeUtil.INTEGER64_FORMAT.equals(schema.getFormat())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.ObjectSchema;
import io.swagger.v3.oas.models.media.Schema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -271,7 +272,7 @@ public void setEnumPropertyNaming(final String enumPropertyNamingType) {
public String getTypeDeclaration(Schema propertySchema) {
if (propertySchema instanceof ArraySchema) {
return getArrayTypeDeclaration((ArraySchema) propertySchema);
} else if (propertySchema instanceof MapSchema || propertySchema.getAdditionalProperties() != null) {
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
Schema inner = (Schema) propertySchema.getAdditionalProperties();
if (inner == null) {
LOGGER.warn(propertySchema.getName() + "(map property) does not have a proper inner type defined");
Expand All @@ -280,6 +281,9 @@ public String getTypeDeclaration(Schema propertySchema) {
}
// Maps will be keyed only by primitive Kotlin string
return String.format("%s<kotlin.String, %s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return String.format("%s<kotlin.String, %s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
}
return super.getTypeDeclaration(propertySchema);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,14 +308,17 @@ public String getTypeDeclaration(Schema propertySchema) {
return "";
}
return getTypeDeclaration(inner) + "[]";
} else if (propertySchema instanceof MapSchema) {
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
MapSchema mapSchema = (MapSchema) propertySchema;
Schema inner = (Schema) mapSchema.getAdditionalProperties();
if (inner == null) {
LOGGER.warn(propertySchema.getName() + "(map property) does not have a proper inner type defined");
return "";
}
return getSchemaType(propertySchema) + "[string," + getTypeDeclaration(inner) + "]";
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
Schema inner = new ObjectSchema();
return getSchemaType(propertySchema) + "[string," + getTypeDeclaration(inner) + "]";
}

return super.getTypeDeclaration(propertySchema);
Expand Down
Loading

0 comments on commit deb1139

Please sign in to comment.