diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index e77eb4b423e..fa8cd65a8f9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -1137,76 +1137,82 @@ public class DefaultCodegen implements CodegenConfig { **/ @SuppressWarnings("static-method") public String getSchemaType(Schema schema) { - // datatype is the OAI type (e.g. integer, long, etc) - String datatype = null; - if (StringUtils.isNotBlank(schema.get$ref())) { // object + String datatype = schema.get$ref(); try { - datatype = schema.get$ref(); // get the model name from $ref if (datatype.indexOf("#/components/schemas/") == 0) { - datatype = datatype.substring("#/components/schemas/".length()); + return datatype.substring("#/components/schemas/".length()); } else if (datatype.indexOf("#/definitions/") == 0) { - datatype = datatype.substring("#/definitions/".length()); + return datatype.substring("#/definitions/".length()); } + return null; } catch (Exception e) { LOGGER.warn("Error obtaining the datatype (" + datatype + ") from ref:" + schema + ". Datatype default to Object"); - datatype = "Object"; + return "object"; } - return datatype; } + return getPrimitiveType(schema); + } + + /** + * Return the OAI type (e.g. integer, long, etc) corresponding to a schema. + *
$ref
is not taken into account by this method. + * @param schema + * @return type + */ + private static String getPrimitiveType(Schema schema) { if (ModelUtils.isStringSchema(schema) && "number".equals(schema.getFormat())) { // special handle of type: string, format: number - datatype = "BigDecimal"; + return "BigDecimal"; } else if (ModelUtils.isByteArraySchema(schema)) { - datatype = "ByteArray"; + return "ByteArray"; } else if (ModelUtils.isFileSchema(schema)) { - datatype = "file"; + return "file"; } else if (ModelUtils.isBinarySchema(schema)) { - datatype = SchemaTypeUtil.BINARY_FORMAT; + return SchemaTypeUtil.BINARY_FORMAT; } else if (ModelUtils.isBooleanSchema(schema)) { - datatype = SchemaTypeUtil.BOOLEAN_TYPE; + return SchemaTypeUtil.BOOLEAN_TYPE; } else if (ModelUtils.isDateSchema(schema)) { - datatype = SchemaTypeUtil.DATE_FORMAT; + return SchemaTypeUtil.DATE_FORMAT; } else if (ModelUtils.isDateTimeSchema(schema)) { - datatype = "DateTime"; + return "DateTime"; } else if (ModelUtils.isNumberSchema(schema)) { if (schema.getFormat() == null) { // no format defined - datatype = "number"; + return "number"; } else if (ModelUtils.isFloatSchema(schema)) { - datatype = SchemaTypeUtil.FLOAT_FORMAT; + return SchemaTypeUtil.FLOAT_FORMAT; } else if (ModelUtils.isDoubleSchema(schema)) { - datatype = SchemaTypeUtil.DOUBLE_FORMAT; + return SchemaTypeUtil.DOUBLE_FORMAT; } else { LOGGER.warn("Unknown `format` detected for " + schema.getName() + ": " + schema.getFormat()); } } else if (ModelUtils.isIntegerSchema(schema)) { if (ModelUtils.isLongSchema(schema)) { - datatype = "long"; + return "long"; } else { - datatype = schema.getType(); // integer + return schema.getType(); // integer } } else if (ModelUtils.isMapSchema(schema)) { - datatype = "map"; + return "map"; } else if (ModelUtils.isArraySchema(schema)) { - datatype = "array"; + return "array"; } else if (ModelUtils.isUUIDSchema(schema)) { - datatype = "UUID"; + return "UUID"; } else if (ModelUtils.isStringSchema(schema)) { - datatype = "string"; + return "string"; } else { if (schema != null) { // TODO the following check should be covered by ModelUtils.isMapSchema(schema) above so can be removed if (SchemaTypeUtil.OBJECT_TYPE.equals(schema.getType()) && schema.getAdditionalProperties() != null) { - datatype = "map"; + return "map"; } else { - datatype = schema.getType(); + return schema.getType(); } } } - - return datatype; + return "object"; } /** @@ -3180,8 +3186,9 @@ public class DefaultCodegen implements CodegenConfig { for (Map.Entry entry : schemas.entrySet()) { String oasName = entry.getKey(); Schema schema = entry.getValue(); - if (schema.getType() != null && !schema.getType().equals("object") && schema.getEnum() == null) { - aliases.put(oasName, schema.getType()); + String typeType = getPrimitiveType(schema); + if (typeType != null && !typeType.equals("object") && schema.getEnum() == null) { + aliases.put(oasName, typeType); } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java index 9bb6be83856..9abe0884084 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java @@ -793,6 +793,34 @@ public class JavaModelTest { Assert.assertEquals(cp2.getter, "getInteger2"); } + @Test(description = "convert a long property in a referenced schema") + public void longPropertyInReferencedSchemaTest() { + final IntegerSchema longProperty = new IntegerSchema().format("int64"); + final Schema TestSchema = new ObjectSchema() + .addProperties("Long1", new Schema<>().$ref("#/components/schemas/LongProperty")) + .addProperties("Long2", new IntegerSchema().format("int64")); + final DefaultCodegen codegen = new JavaClientCodegen(); + final Map allDefinitions = Collections.singletonMap("LongProperty", + longProperty); + final CodegenModel cm = codegen.fromModel("test", TestSchema, allDefinitions); + + Assert.assertEquals(cm.vars.size(), 2); + + CodegenProperty cp1 = cm.vars.get(0); + Assert.assertEquals(cp1.baseName, "Long1"); + Assert.assertEquals(cp1.datatype, "Long"); + Assert.assertEquals(cp1.name, "long1"); + Assert.assertEquals(cp1.baseType, "Long"); + Assert.assertEquals(cp1.getter, "getLong1"); + + CodegenProperty cp2 = cm.vars.get(1); + Assert.assertEquals(cp2.baseName, "Long2"); + Assert.assertEquals(cp2.datatype, "Long"); + Assert.assertEquals(cp2.name, "long2"); + Assert.assertEquals(cp2.baseType, "Long"); + Assert.assertEquals(cp2.getter, "getLong2"); + } + @Test(description = "convert an array schema") public void arraySchemaTest() { final Schema testSchema = new ObjectSchema()