forked from loafle/openapi-generator-original
Java importmapping 3589 (#4350)
* type aliasing issue * Add example OpenAPI document from issue 3589 https://github.com/OpenAPITools/openapi-generator/issues/3589 * Add test to reproduce the issue - type of TypeAlias changed from 'string' to 'object' (not sure if importMapping is supposed also for 'string' types...) - there might be better ways to write the test, it's kind of a brute force test (generate a file and parse it with a regexp) * Remove duplicate test file * Add new method override handleMethodResponse Fixes broken unit test after merge from master Co-authored-by: bkoziak <bkoziak@gmail.com> Co-authored-by: William Cheng <wing328hk@gmail.com>
This commit is contained in:
parent
f5265853ba
commit
eecd8c056a
@ -641,7 +641,7 @@ public class CodeGenMojo extends AbstractMojo {
|
|||||||
configurator);
|
configurator);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retained for backwards-compataibility with configOptions -> import-mappings
|
// Retained for backwards-compatibility with configOptions -> import-mappings
|
||||||
if (importMappings == null && configOptions.containsKey("import-mappings")) {
|
if (importMappings == null && configOptions.containsKey("import-mappings")) {
|
||||||
applyImportMappingsKvp(configOptions.get("import-mappings").toString(),
|
applyImportMappingsKvp(configOptions.get("import-mappings").toString(),
|
||||||
configurator);
|
configurator);
|
||||||
@ -869,6 +869,7 @@ public class CodeGenMojo extends AbstractMojo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method enables conversion of true/false strings in
|
* This method enables conversion of true/false strings in
|
||||||
* config.additionalProperties (configuration/configOptions) to proper booleans.
|
* config.additionalProperties (configuration/configOptions) to proper booleans.
|
||||||
|
@ -1798,12 +1798,15 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
* @return the string representation of the schema type.
|
* @return the string representation of the schema type.
|
||||||
*/
|
*/
|
||||||
private String getSingleSchemaType(Schema schema) {
|
private String getSingleSchemaType(Schema schema) {
|
||||||
Schema unaliasSchema = ModelUtils.unaliasSchema(this.openAPI, schema);
|
Schema unaliasSchema = ModelUtils.unaliasSchema(this.openAPI, schema, importMapping);
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(unaliasSchema.get$ref())) { // reference to another definition/schema
|
if (StringUtils.isNotBlank(unaliasSchema.get$ref())) { // reference to another definition/schema
|
||||||
// get the schema/model name from $ref
|
// get the schema/model name from $ref
|
||||||
String schemaName = ModelUtils.getSimpleRef(unaliasSchema.get$ref());
|
String schemaName = ModelUtils.getSimpleRef(unaliasSchema.get$ref());
|
||||||
if (StringUtils.isNotEmpty(schemaName)) {
|
if (StringUtils.isNotEmpty(schemaName)) {
|
||||||
|
if (importMapping.containsKey(schemaName)) {
|
||||||
|
return schemaName;
|
||||||
|
}
|
||||||
return getAlias(schemaName);
|
return getAlias(schemaName);
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Error obtaining the datatype from ref:" + unaliasSchema.get$ref() + ". Default to 'object'");
|
LOGGER.warn("Error obtaining the datatype from ref:" + unaliasSchema.get$ref() + ". Default to 'object'");
|
||||||
@ -1903,7 +1906,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
return (name.length() > 0) ? (Character.toLowerCase(name.charAt(0)) + name.substring(1)) : "";
|
return (name.length() > 0) ? (Character.toLowerCase(name.charAt(0)) + name.substring(1)) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output the type declaration of a given name
|
* Output the type declaration of a given name
|
||||||
*
|
*
|
||||||
@ -2021,7 +2023,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// unalias schema
|
// unalias schema
|
||||||
schema = ModelUtils.unaliasSchema(this.openAPI, schema);
|
schema = ModelUtils.unaliasSchema(this.openAPI, schema, importMapping);
|
||||||
if (schema == null) {
|
if (schema == null) {
|
||||||
LOGGER.warn("Schema {} not found", name);
|
LOGGER.warn("Schema {} not found", name);
|
||||||
return null;
|
return null;
|
||||||
@ -2372,7 +2374,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
LOGGER.debug("debugging fromProperty for " + name + " : " + p);
|
LOGGER.debug("debugging fromProperty for " + name + " : " + p);
|
||||||
|
|
||||||
// unalias schema
|
// unalias schema
|
||||||
p = ModelUtils.unaliasSchema(this.openAPI, p);
|
p = ModelUtils.unaliasSchema(this.openAPI, p, importMapping);
|
||||||
|
|
||||||
CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY);
|
CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY);
|
||||||
|
|
||||||
@ -2526,12 +2528,13 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
} else if (ModelUtils.isArraySchema(p)) {
|
} else if (ModelUtils.isArraySchema(p)) {
|
||||||
// default to string if inner item is undefined
|
// default to string if inner item is undefined
|
||||||
ArraySchema arraySchema = (ArraySchema) p;
|
ArraySchema arraySchema = (ArraySchema) p;
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema));
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
||||||
if (arraySchema.getItems() == null) {
|
if (arraySchema.getItems() == null) {
|
||||||
arraySchema.setItems(innerSchema);
|
arraySchema.setItems(innerSchema);
|
||||||
}
|
}
|
||||||
} else if (ModelUtils.isMapSchema(p)) {
|
} else if (ModelUtils.isMapSchema(p)) {
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p));
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p),
|
||||||
|
importMapping);
|
||||||
if (innerSchema == null) {
|
if (innerSchema == null) {
|
||||||
LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName());
|
LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName());
|
||||||
innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
|
innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
|
||||||
@ -2607,7 +2610,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
itemName = property.name;
|
itemName = property.name;
|
||||||
}
|
}
|
||||||
ArraySchema arraySchema = (ArraySchema) p;
|
ArraySchema arraySchema = (ArraySchema) p;
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema));
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
|
||||||
if (arraySchema.getItems() == null) {
|
if (arraySchema.getItems() == null) {
|
||||||
arraySchema.setItems(innerSchema);
|
arraySchema.setItems(innerSchema);
|
||||||
}
|
}
|
||||||
@ -2622,7 +2625,8 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
property.maxItems = p.getMaxProperties();
|
property.maxItems = p.getMaxProperties();
|
||||||
|
|
||||||
// handle inner property
|
// handle inner property
|
||||||
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p));
|
Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p),
|
||||||
|
importMapping);
|
||||||
if (innerSchema == null) {
|
if (innerSchema == null) {
|
||||||
LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName());
|
LOGGER.error("Undefined map inner type for `{}`. Default to String.", p.getName());
|
||||||
innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
|
innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
|
||||||
@ -2841,7 +2845,24 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
Map<String, Schema> schemas,
|
Map<String, Schema> schemas,
|
||||||
CodegenOperation op,
|
CodegenOperation op,
|
||||||
ApiResponse methodResponse) {
|
ApiResponse methodResponse) {
|
||||||
Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse));
|
handleMethodResponse(operation, schemas, op, methodResponse, Collections.<String, String>emptyMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set op's returnBaseType, returnType, examples etc.
|
||||||
|
*
|
||||||
|
* @param operation endpoint Operation
|
||||||
|
* @param schemas a map of the schemas in the openapi spec
|
||||||
|
* @param op endpoint CodegenOperation
|
||||||
|
* @param methodResponse the default ApiResponse for the endpoint
|
||||||
|
* @param importMappings mappings of external types to be omitted by unaliasing
|
||||||
|
*/
|
||||||
|
protected void handleMethodResponse(Operation operation,
|
||||||
|
Map<String, Schema> schemas,
|
||||||
|
CodegenOperation op,
|
||||||
|
ApiResponse methodResponse,
|
||||||
|
Map<String, String> importMappings) {
|
||||||
|
Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse), importMappings);
|
||||||
|
|
||||||
if (responseSchema != null) {
|
if (responseSchema != null) {
|
||||||
CodegenProperty cm = fromProperty("response", responseSchema);
|
CodegenProperty cm = fromProperty("response", responseSchema);
|
||||||
@ -2996,7 +3017,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
op.responses.get(op.responses.size() - 1).hasMore = false;
|
op.responses.get(op.responses.size() - 1).hasMore = false;
|
||||||
|
|
||||||
if (methodResponse != null) {
|
if (methodResponse != null) {
|
||||||
handleMethodResponse(operation, schemas, op, methodResponse);
|
handleMethodResponse(operation, schemas, op, methodResponse, importMapping);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3130,9 +3151,12 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
Collections.sort(allParams, new Comparator<CodegenParameter>() {
|
Collections.sort(allParams, new Comparator<CodegenParameter>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(CodegenParameter one, CodegenParameter another) {
|
public int compare(CodegenParameter one, CodegenParameter another) {
|
||||||
if (one.required == another.required) return 0;
|
if (one.required == another.required)
|
||||||
else if (one.required) return -1;
|
return 0;
|
||||||
else return 1;
|
else if (one.required)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -3211,7 +3235,8 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
}
|
}
|
||||||
Schema responseSchema;
|
Schema responseSchema;
|
||||||
if (this.openAPI != null && this.openAPI.getComponents() != null) {
|
if (this.openAPI != null && this.openAPI.getComponents() != null) {
|
||||||
responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response));
|
responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response),
|
||||||
|
importMapping);
|
||||||
} else { // no model/alias defined
|
} else { // no model/alias defined
|
||||||
responseSchema = ModelUtils.getSchemaFromResponse(response);
|
responseSchema = ModelUtils.getSchemaFromResponse(response);
|
||||||
}
|
}
|
||||||
@ -3443,7 +3468,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
Schema parameterSchema = ModelUtils.unaliasSchema(this.openAPI, s);
|
Schema parameterSchema = ModelUtils.unaliasSchema(this.openAPI, s, importMapping);
|
||||||
if (parameterSchema == null) {
|
if (parameterSchema == null) {
|
||||||
LOGGER.warn("warning! Schema not found for parameter \"" + parameter.getName() + "\", using String");
|
LOGGER.warn("warning! Schema not found for parameter \"" + parameter.getName() + "\", using String");
|
||||||
parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition.");
|
parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition.");
|
||||||
@ -4047,7 +4072,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
private Map<String, Schema> unaliasPropertySchema(Map<String, Schema> properties) {
|
private Map<String, Schema> unaliasPropertySchema(Map<String, Schema> properties) {
|
||||||
if (properties != null) {
|
if (properties != null) {
|
||||||
for (String key : properties.keySet()) {
|
for (String key : properties.keySet()) {
|
||||||
properties.put(key, ModelUtils.unaliasSchema(this.openAPI, properties.get(key)));
|
properties.put(key, ModelUtils.unaliasSchema(this.openAPI, properties.get(key), importMapping()));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5422,7 +5447,6 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
codegenParameter.maxLength = codegenProperty.maxLength;
|
codegenParameter.maxLength = codegenProperty.maxLength;
|
||||||
codegenParameter.pattern = codegenProperty.pattern;
|
codegenParameter.pattern = codegenProperty.pattern;
|
||||||
|
|
||||||
|
|
||||||
if (codegenProperty.complexType != null) {
|
if (codegenProperty.complexType != null) {
|
||||||
imports.add(codegenProperty.complexType);
|
imports.add(codegenProperty.complexType);
|
||||||
}
|
}
|
||||||
|
@ -261,7 +261,7 @@ public class CppRestSdkClientCodegen extends AbstractCppCodegen {
|
|||||||
|
|
||||||
if (methodResponse != null) {
|
if (methodResponse != null) {
|
||||||
Schema response = ModelUtils.getSchemaFromResponse(methodResponse);
|
Schema response = ModelUtils.getSchemaFromResponse(methodResponse);
|
||||||
response = ModelUtils.unaliasSchema(this.openAPI, response);
|
response = ModelUtils.unaliasSchema(this.openAPI, response, importMapping);
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
CodegenProperty cm = fromProperty("response", response);
|
CodegenProperty cm = fromProperty("response", response);
|
||||||
op.vendorExtensions.put("x-codegen-response", cm);
|
op.vendorExtensions.put("x-codegen-response", cm);
|
||||||
|
@ -529,7 +529,7 @@ public class PythonClientExperimentalCodegen extends PythonClientCodegen {
|
|||||||
// When we serialize/deserialize ModelSimple models, validations and enums will be checked.
|
// When we serialize/deserialize ModelSimple models, validations and enums will be checked.
|
||||||
Schema responseSchema;
|
Schema responseSchema;
|
||||||
if (this.openAPI != null && this.openAPI.getComponents() != null) {
|
if (this.openAPI != null && this.openAPI.getComponents() != null) {
|
||||||
responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response));
|
responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(response), importMapping);
|
||||||
} else { // no model/alias defined
|
} else { // no model/alias defined
|
||||||
responseSchema = ModelUtils.getSchemaFromResponse(response);
|
responseSchema = ModelUtils.getSchemaFromResponse(response);
|
||||||
}
|
}
|
||||||
@ -582,12 +582,30 @@ public class PythonClientExperimentalCodegen extends PythonClientCodegen {
|
|||||||
Map<String, Schema> schemas,
|
Map<String, Schema> schemas,
|
||||||
CodegenOperation op,
|
CodegenOperation op,
|
||||||
ApiResponse methodResponse) {
|
ApiResponse methodResponse) {
|
||||||
|
handleMethodResponse(operation, schemas, op, methodResponse, Collections.<String, String>emptyMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set op's returnBaseType, returnType, examples etc.
|
||||||
|
*
|
||||||
|
* @param operation endpoint Operation
|
||||||
|
* @param schemas a map of the schemas in the openapi spec
|
||||||
|
* @param op endpoint CodegenOperation
|
||||||
|
* @param methodResponse the default ApiResponse for the endpoint
|
||||||
|
* @param importMappings mappings of external types to be omitted by unaliasing
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void handleMethodResponse(Operation operation,
|
||||||
|
Map<String, Schema> schemas,
|
||||||
|
CodegenOperation op,
|
||||||
|
ApiResponse methodResponse,
|
||||||
|
Map<String, String> importMappings) {
|
||||||
// we have a custom version of this method to handle endpoints that return models where
|
// we have a custom version of this method to handle endpoints that return models where
|
||||||
// type != object the model has validations and/or enums
|
// type != object the model has validations and/or enums
|
||||||
// we do this by invoking our custom fromResponse method to create defaultResponse
|
// we do this by invoking our custom fromResponse method to create defaultResponse
|
||||||
// which we then use to set op.returnType and op.returnBaseType
|
// which we then use to set op.returnType and op.returnBaseType
|
||||||
CodegenResponse defaultResponse = fromResponse("defaultResponse", methodResponse);
|
CodegenResponse defaultResponse = fromResponse("defaultResponse", methodResponse);
|
||||||
Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse));
|
Schema responseSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getSchemaFromResponse(methodResponse), importMappings);
|
||||||
|
|
||||||
if (responseSchema != null) {
|
if (responseSchema != null) {
|
||||||
op.returnBaseType = defaultResponse.baseType;
|
op.returnBaseType = defaultResponse.baseType;
|
||||||
|
@ -101,7 +101,16 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
|
|||||||
@Override
|
@Override
|
||||||
protected void handleMethodResponse(Operation operation, Map<String, Schema> schemas, CodegenOperation op,
|
protected void handleMethodResponse(Operation operation, Map<String, Schema> schemas, CodegenOperation op,
|
||||||
ApiResponse methodResponse) {
|
ApiResponse methodResponse) {
|
||||||
super.handleMethodResponse(operation, schemas, op, methodResponse);
|
handleMethodResponse(operation, schemas, op, methodResponse, Collections.<String, String>emptyMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void handleMethodResponse(Operation operation,
|
||||||
|
Map<String, Schema> schemas,
|
||||||
|
CodegenOperation op,
|
||||||
|
ApiResponse methodResponse,
|
||||||
|
Map<String, String> importMappings) {
|
||||||
|
super.handleMethodResponse(operation, schemas, op, methodResponse, importMappings);
|
||||||
|
|
||||||
// see comment in getTypeDeclaration
|
// see comment in getTypeDeclaration
|
||||||
if (op.isResponseFile) {
|
if (op.isResponseFile) {
|
||||||
|
@ -47,6 +47,7 @@ public class ModelUtils {
|
|||||||
private static final String URI_FORMAT = "uri";
|
private static final String URI_FORMAT = "uri";
|
||||||
|
|
||||||
private static final String generateAliasAsModelKey = "generateAliasAsModel";
|
private static final String generateAliasAsModelKey = "generateAliasAsModel";
|
||||||
|
|
||||||
public static void setGenerateAliasAsModel(boolean value) {
|
public static void setGenerateAliasAsModel(boolean value) {
|
||||||
GlobalSettings.setProperty(generateAliasAsModelKey, Boolean.toString(value));
|
GlobalSettings.setProperty(generateAliasAsModelKey, Boolean.toString(value));
|
||||||
}
|
}
|
||||||
@ -240,7 +241,7 @@ public class ModelUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void visitParameters(OpenAPI openAPI, List<Parameter> parameters, OpenAPISchemaVisitor visitor,
|
private static void visitParameters(OpenAPI openAPI, List<Parameter> parameters, OpenAPISchemaVisitor visitor,
|
||||||
List<String> visitedSchemas) {
|
List<String> visitedSchemas) {
|
||||||
if (parameters != null) {
|
if (parameters != null) {
|
||||||
for (Parameter p : parameters) {
|
for (Parameter p : parameters) {
|
||||||
Parameter parameter = getReferencedParameter(openAPI, p);
|
Parameter parameter = getReferencedParameter(openAPI, p);
|
||||||
@ -870,7 +871,22 @@ public class ModelUtils {
|
|||||||
* @param schema schema (alias or direct reference)
|
* @param schema schema (alias or direct reference)
|
||||||
* @return actual schema
|
* @return actual schema
|
||||||
*/
|
*/
|
||||||
public static Schema unaliasSchema(OpenAPI openAPI, Schema schema) {
|
public static Schema unaliasSchema(OpenAPI openAPI,
|
||||||
|
Schema schema) {
|
||||||
|
return unaliasSchema(openAPI, schema, Collections.<String, String>emptyMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the actual schema from aliases. If the provided schema is not an alias, the schema itself will be returned.
|
||||||
|
*
|
||||||
|
* @param openAPI specification being checked
|
||||||
|
* @param schema schema (alias or direct reference)
|
||||||
|
* @param importMappings mappings of external types to be omitted by unaliasing
|
||||||
|
* @return actual schema
|
||||||
|
*/
|
||||||
|
public static Schema unaliasSchema(OpenAPI openAPI,
|
||||||
|
Schema schema,
|
||||||
|
Map<String, String> importMappings) {
|
||||||
Map<String, Schema> allSchemas = getSchemas(openAPI);
|
Map<String, Schema> allSchemas = getSchemas(openAPI);
|
||||||
if (allSchemas == null || allSchemas.isEmpty()) {
|
if (allSchemas == null || allSchemas.isEmpty()) {
|
||||||
// skip the warning as the spec can have no model defined
|
// skip the warning as the spec can have no model defined
|
||||||
@ -879,7 +895,12 @@ public class ModelUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (schema != null && StringUtils.isNotEmpty(schema.get$ref())) {
|
if (schema != null && StringUtils.isNotEmpty(schema.get$ref())) {
|
||||||
Schema ref = allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()));
|
String simpleRef = ModelUtils.getSimpleRef(schema.get$ref());
|
||||||
|
if (importMappings.containsKey(simpleRef)) {
|
||||||
|
LOGGER.info("Schema unaliasing of {} omitted because aliased class is to be mapped to {}", simpleRef, importMappings.get(simpleRef));
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
|
Schema ref = allSchemas.get(simpleRef);
|
||||||
if (ref == null) {
|
if (ref == null) {
|
||||||
once(LOGGER).warn("{} is not defined", schema.get$ref());
|
once(LOGGER).warn("{} is not defined", schema.get$ref());
|
||||||
return schema;
|
return schema;
|
||||||
@ -890,7 +911,8 @@ public class ModelUtils {
|
|||||||
if (isGenerateAliasAsModel()) {
|
if (isGenerateAliasAsModel()) {
|
||||||
return schema; // generate a model extending array
|
return schema; // generate a model extending array
|
||||||
} else {
|
} else {
|
||||||
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())));
|
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())),
|
||||||
|
importMappings);
|
||||||
}
|
}
|
||||||
} else if (isComposedSchema(ref)) {
|
} else if (isComposedSchema(ref)) {
|
||||||
return schema;
|
return schema;
|
||||||
@ -902,17 +924,19 @@ public class ModelUtils {
|
|||||||
return schema; // generate a model extending map
|
return schema; // generate a model extending map
|
||||||
} else {
|
} else {
|
||||||
// treat it as a typical map
|
// treat it as a typical map
|
||||||
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())));
|
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())),
|
||||||
|
importMappings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (isObjectSchema(ref)) { // model
|
} else if (isObjectSchema(ref)) { // model
|
||||||
if (ref.getProperties() != null && !ref.getProperties().isEmpty()) { // has at least one property
|
if (ref.getProperties() != null && !ref.getProperties().isEmpty()) { // has at least one property
|
||||||
return schema;
|
return schema;
|
||||||
} else { // free form object (type: object)
|
} else { // free form object (type: object)
|
||||||
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())));
|
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())),
|
||||||
|
importMappings);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())));
|
return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), importMappings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return schema;
|
return schema;
|
||||||
|
@ -1073,6 +1073,21 @@ public class DefaultCodegenTest {
|
|||||||
Assert.assertEquals(codegenModel.vars.size(), 1);
|
Assert.assertEquals(codegenModel.vars.size(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void importMapping() {
|
||||||
|
DefaultCodegen codegen = new DefaultCodegen();
|
||||||
|
codegen.importMapping.put("TypeAlias", "foo.bar.TypeAlias");
|
||||||
|
|
||||||
|
OpenAPI openAPI = new OpenAPIParser()
|
||||||
|
.readLocation("src/test/resources/3_0/type-alias.yaml", null, new ParseOptions()).getOpenAPI();
|
||||||
|
codegen.setOpenAPI(openAPI);
|
||||||
|
|
||||||
|
CodegenModel codegenModel = codegen.fromModel("ParentType", openAPI.getComponents().getSchemas().get("ParentType"));
|
||||||
|
|
||||||
|
Assert.assertEquals(codegenModel.vars.size(), 1);
|
||||||
|
Assert.assertEquals(codegenModel.vars.get(0).getBaseType(), "TypeAlias");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void modelWithPrefixDoNotContainInheritedVars() {
|
public void modelWithPrefixDoNotContainInheritedVars() {
|
||||||
DefaultCodegen codegen = new DefaultCodegen();
|
DefaultCodegen codegen = new DefaultCodegen();
|
||||||
|
@ -17,38 +17,16 @@
|
|||||||
|
|
||||||
package org.openapitools.codegen.java;
|
package org.openapitools.codegen.java;
|
||||||
|
|
||||||
import static org.openapitools.codegen.TestUtils.validateJavaSourceFiles;
|
|
||||||
import static org.testng.Assert.assertEquals;
|
|
||||||
import static org.testng.Assert.assertTrue;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
import io.swagger.v3.oas.models.OpenAPI;
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
import io.swagger.v3.oas.models.Operation;
|
import io.swagger.v3.oas.models.Operation;
|
||||||
import io.swagger.v3.oas.models.media.ArraySchema;
|
import io.swagger.v3.oas.models.media.*;
|
||||||
import io.swagger.v3.oas.models.media.ComposedSchema;
|
|
||||||
import io.swagger.v3.oas.models.media.Content;
|
|
||||||
import io.swagger.v3.oas.models.media.IntegerSchema;
|
|
||||||
import io.swagger.v3.oas.models.media.MediaType;
|
|
||||||
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.RequestBody;
|
import io.swagger.v3.oas.models.parameters.RequestBody;
|
||||||
import io.swagger.v3.oas.models.responses.ApiResponse;
|
import io.swagger.v3.oas.models.responses.ApiResponse;
|
||||||
import io.swagger.v3.parser.util.SchemaTypeUtil;
|
import io.swagger.v3.parser.util.SchemaTypeUtil;
|
||||||
|
import org.openapitools.codegen.*;
|
||||||
import org.openapitools.codegen.ClientOptInput;
|
|
||||||
import org.openapitools.codegen.CodegenConstants;
|
|
||||||
import org.openapitools.codegen.CodegenModel;
|
|
||||||
import org.openapitools.codegen.CodegenOperation;
|
|
||||||
import org.openapitools.codegen.CodegenParameter;
|
|
||||||
import org.openapitools.codegen.CodegenProperty;
|
|
||||||
import org.openapitools.codegen.CodegenResponse;
|
|
||||||
import org.openapitools.codegen.CodegenSecurity;
|
|
||||||
import org.openapitools.codegen.DefaultGenerator;
|
|
||||||
import org.openapitools.codegen.MockDefaultGenerator;
|
|
||||||
import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile;
|
import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile;
|
||||||
import org.openapitools.codegen.TestUtils;
|
|
||||||
import org.openapitools.codegen.config.CodegenConfigurator;
|
import org.openapitools.codegen.config.CodegenConfigurator;
|
||||||
import org.openapitools.codegen.languages.AbstractJavaCodegen;
|
import org.openapitools.codegen.languages.AbstractJavaCodegen;
|
||||||
import org.openapitools.codegen.languages.JavaClientCodegen;
|
import org.openapitools.codegen.languages.JavaClientCodegen;
|
||||||
@ -56,16 +34,17 @@ import org.testng.Assert;
|
|||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
import java.util.regex.Matcher;
|
||||||
import java.util.Collections;
|
import java.util.regex.Pattern;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.openapitools.codegen.TestUtils.validateJavaSourceFiles;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
public class JavaClientCodegenTest {
|
public class JavaClientCodegenTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -544,11 +523,60 @@ public class JavaClientCodegenTest {
|
|||||||
Assert.assertEquals(cm.getClassname(), "OtherObj");
|
Assert.assertEquals(cm.getClassname(), "OtherObj");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://github.com/OpenAPITools/openapi-generator/issues/3589
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testImportMapping() throws IOException {
|
||||||
|
|
||||||
|
Map<String, Object> properties = new HashMap<>();
|
||||||
|
properties.put(JavaClientCodegen.JAVA8_MODE, true);
|
||||||
|
properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api");
|
||||||
|
|
||||||
|
Map<String, String> importMappings = new HashMap<>();
|
||||||
|
importMappings.put("TypeAlias", "foo.bar.TypeAlias");
|
||||||
|
|
||||||
|
File output = Files.createTempDirectory("test").toFile();
|
||||||
|
|
||||||
|
final CodegenConfigurator configurator = new CodegenConfigurator()
|
||||||
|
.setGeneratorName("java")
|
||||||
|
.setLibrary(JavaClientCodegen.RESTEASY)
|
||||||
|
.setAdditionalProperties(properties)
|
||||||
|
.setImportMappings(importMappings)
|
||||||
|
.setInputSpec("src/test/resources/3_0/type-alias.yaml")
|
||||||
|
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
|
||||||
|
|
||||||
|
final ClientOptInput clientOptInput = configurator.toClientOptInput();
|
||||||
|
Assert.assertEquals(clientOptInput.getConfig().importMapping().get("TypeAlias"), "foo.bar.TypeAlias");
|
||||||
|
|
||||||
|
MockDefaultGenerator generator = new MockDefaultGenerator();
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false");
|
||||||
|
generator.opts(clientOptInput).generate();
|
||||||
|
|
||||||
|
Map<String, String> generatedFiles = generator.getFiles();
|
||||||
|
Assert.assertEquals(generatedFiles.size(), 1);
|
||||||
|
TestUtils.ensureContainsFile(generatedFiles, output, "src/main/java/org/openapitools/client/model/ParentType.java");
|
||||||
|
|
||||||
|
final String parentTypeContents = generatedFiles.values().iterator().next();
|
||||||
|
|
||||||
|
final Pattern FIELD_PATTERN = Pattern.compile(".* private (.*?) typeAlias;.*", Pattern.DOTALL);
|
||||||
|
Matcher fieldMatcher = FIELD_PATTERN.matcher(parentTypeContents);
|
||||||
|
Assert.assertTrue(fieldMatcher.matches());
|
||||||
|
|
||||||
|
// this is the type of the field 'typeAlias'. With a working importMapping it should
|
||||||
|
// be 'foo.bar.TypeAlias' or just 'TypeAlias'
|
||||||
|
Assert.assertEquals(fieldMatcher.group(1), "foo.bar.TypeAlias");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBearerAuth() {
|
public void testBearerAuth() {
|
||||||
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/pingBearerAuth.yaml");
|
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/pingBearerAuth.yaml");
|
||||||
JavaClientCodegen codegen = new JavaClientCodegen();
|
JavaClientCodegen codegen = new JavaClientCodegen();
|
||||||
|
|
||||||
List<CodegenSecurity> security = codegen.fromSecurity(openAPI.getComponents().getSecuritySchemes());
|
List<CodegenSecurity> security = codegen.fromSecurity(openAPI.getComponents().getSecuritySchemes());
|
||||||
Assert.assertEquals(security.size(), 1);
|
Assert.assertEquals(security.size(), 1);
|
||||||
Assert.assertEquals(security.get(0).isBasic, Boolean.TRUE);
|
Assert.assertEquals(security.get(0).isBasic, Boolean.TRUE);
|
||||||
|
@ -205,7 +205,20 @@ public class ModelUtilsTest {
|
|||||||
|
|
||||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("SomeComposedSchema", composedSchema);
|
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("SomeComposedSchema", composedSchema);
|
||||||
|
|
||||||
Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(openAPI, refToComposedSchema));
|
Assert.assertEquals(refToComposedSchema, ModelUtils.unaliasSchema(openAPI, refToComposedSchema, new HashMap<>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAliasedTypeIsNotUnaliasedIfUsedForImportMapping(){
|
||||||
|
Schema emailSchema = new Schema().$ref("#/components/schemas/Email").type("string");
|
||||||
|
StringSchema stringSchema = new StringSchema();
|
||||||
|
HashMap<String, String> importMappings = new HashMap<>();
|
||||||
|
importMappings.put("Email","foo.bar.Email");
|
||||||
|
|
||||||
|
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("Email", stringSchema);
|
||||||
|
|
||||||
|
Assert.assertEquals(emailSchema, ModelUtils.unaliasSchema(openAPI, emailSchema, importMappings));
|
||||||
|
Assert.assertEquals(stringSchema, ModelUtils.unaliasSchema(openAPI, emailSchema, new HashMap<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: API using a typeAlias mapped with importMapping
|
||||||
|
description: See https://github.com/OpenAPITools/openapi-generator/issues/3589
|
||||||
|
version: 1.0.0
|
||||||
|
paths:
|
||||||
|
/type-alias:
|
||||||
|
get:
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: OK
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ParentType'
|
||||||
|
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
ParentType:
|
||||||
|
title: ParentType
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
typeAlias:
|
||||||
|
$ref: '#/components/schemas/TypeAlias'
|
||||||
|
TypeAlias:
|
||||||
|
type: string
|
Loading…
x
Reference in New Issue
Block a user