From e4183319e820d69f1aa7b9b15918020d428eaacd Mon Sep 17 00:00:00 2001 From: Vincent Devos <46601673+karismann@users.noreply.github.com> Date: Mon, 18 Feb 2019 11:00:35 +0100 Subject: [PATCH] [Java] Getter/Setter naming convention not followed in generated models (#2095) fix the getter/setter when the second letter of the field name is already uppercase (following the JavaBeans API specification) --- .../openapitools/codegen/DefaultCodegen.java | 2 +- .../languages/AbstractJavaCodegen.java | 30 ++++++++++++++++ .../codegen/java/JavaModelTest.java | 34 +++++++++++++++++-- 3 files changed, 62 insertions(+), 4 deletions(-) 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 6db9d65b221c..c153ed99da0b 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 @@ -1551,7 +1551,7 @@ public String toGetter(String name) { } /** - * Output the Getter name, e.g. getSize + * Output the Setter name, e.g. setSize * * @param name the name of the property * @return setter name based on naming convention diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 5f270f364107..438cb8cae20c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -1378,10 +1378,12 @@ public void setSupportJava6(boolean value) { this.supportJava6 = value; } + @Override public String toRegularExpression(String pattern) { return escapeText(pattern); } + @Override public boolean convertPropertyToBoolean(String propertyKey) { boolean booleanValue = false; if (additionalProperties.containsKey(propertyKey)) { @@ -1391,6 +1393,7 @@ public boolean convertPropertyToBoolean(String propertyKey) { return booleanValue; } + @Override public void writePropertyBack(String propertyKey, boolean value) { additionalProperties.put(propertyKey, value); } @@ -1416,6 +1419,33 @@ public String sanitizeTag(String tag) { return tag; } + /** + * Camelize the method name of the getter and setter + * + * @param name string to be camelized + * @return Camelized string + */ + @Override + public String getterAndSetterCapitalize(String name) { + boolean lowercaseFirstLetter = false; + if (name == null || name.length() == 0) { + return name; + } + name = toVarName(name); + // + // Let the property name capitalized + // except when the first letter of the property name is lowercase and the second letter is uppercase + // Refer to section 8.8: Capitalization of inferred names of the JavaBeans API specification + // http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf) + // + if (name.length() > 1 && Character.isLowerCase(name.charAt(0)) && Character.isUpperCase(name.charAt(1))) { + lowercaseFirstLetter = true; + } + return camelize(name, lowercaseFirstLetter); + } + + + @Override public void postProcessFile(File file, String fileType) { if (file == null) { 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 fa076ea5ffa4..055692e0fef2 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 @@ -225,7 +225,7 @@ public void list2DPropertyTest() { Assert.assertTrue(property.isContainer); } - @Test(description = "convert a model with restriced characters") + @Test(description = "convert a model with restricted characters") public void restrictedCharactersPropertiesTest() { final Schema schema = new Schema() .description("a sample model") @@ -466,8 +466,8 @@ public void secondCharUpperCaseNamesTest() { final CodegenProperty property = cm.vars.get(0); Assert.assertEquals(property.baseName, "pId"); - Assert.assertEquals(property.getter, "getPId"); - Assert.assertEquals(property.setter, "setPId"); + Assert.assertEquals(property.getter, "getpId"); + Assert.assertEquals(property.setter, "setpId"); Assert.assertEquals(property.dataType, "String"); Assert.assertEquals(property.name, "pId"); Assert.assertEquals(property.defaultValue, null); @@ -505,6 +505,34 @@ public void firstTwoUpperCaseLetterNamesTest() { Assert.assertFalse(property.isContainer); } + @Test(description = "convert a model with an all upper-case letter and one non letter property names") + public void allUpperCaseOneNonLetterNamesTest() { + final Schema schema = new Schema() + .description("a model with a property name starting with two upper-case letters") + .addProperties("ATT_NAME", new StringSchema()) + .addRequiredItem("ATT_NAME"); + final DefaultCodegen codegen = new JavaClientCodegen(); + OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema); + codegen.setOpenAPI(openAPI); + final CodegenModel cm = codegen.fromModel("sample", schema); + + Assert.assertEquals(cm.name, "sample"); + Assert.assertEquals(cm.classname, "Sample"); + Assert.assertEquals(cm.vars.size(), 1); + + final CodegenProperty property = cm.vars.get(0); + Assert.assertEquals(property.baseName, "ATT_NAME"); + Assert.assertEquals(property.getter, "getATTNAME"); + Assert.assertEquals(property.setter, "setATTNAME"); + Assert.assertEquals(property.dataType, "String"); + Assert.assertEquals(property.name, "ATT_NAME"); + Assert.assertEquals(property.defaultValue, null); + Assert.assertEquals(property.baseType, "String"); + Assert.assertFalse(property.hasMore); + Assert.assertTrue(property.required); + Assert.assertFalse(property.isContainer); + } + @Test(description = "convert hyphens per issue 503") public void hyphensTest() { final Schema schema = new Schema()