Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix handling of boolean additionalProperties #368

Merged
merged 1 commit into from
Apr 24, 2019
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
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