From e7410d4c8e0c664fa376a40b21a743735b6f5cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Mon, 23 Apr 2018 15:48:10 +0200 Subject: [PATCH] Allow $ in java var name (#200) --- .../openapitools/codegen/DefaultCodegen.java | 24 ++++++++++++++++--- .../languages/AbstractJavaCodegen.java | 2 +- .../codegen/DefaultCodegenTest.java | 19 ++++++++++++++- .../codegen/java/AbstractJavaCodegenTest.java | 17 +++++++++++++ 4 files changed, 57 insertions(+), 5 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 b09866db4a10..9c57b56ab1af 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 @@ -3320,7 +3320,14 @@ public static String camelize(String word, boolean lowercaseFirstLetter) { } if (lowercaseFirstLetter && word.length() > 0) { - word = word.substring(0, 1).toLowerCase() + word.substring(1); + int i = 0; + char charAt = word.charAt(i); + while(i + 1 < word.length() && !((charAt >= 'a' && charAt <= 'z') || (charAt >= 'A' && charAt <= 'Z'))) { + i = i + 1; + charAt = word.charAt(i); + } + i = i + 1; + word = word.substring(0, i).toLowerCase() + word.substring(i); } // remove all underscore @@ -3514,6 +3521,17 @@ protected CliOption buildLibraryCliOption(Map supportedLibraries */ @SuppressWarnings("static-method") public String sanitizeName(String name) { + return sanitizeName(name, "\\W"); + } + + /** + * Sanitize name (parameter, property, method, etc) + * + * @param name string to be sanitize + * @param removeCharRegEx a regex containing all char that will be removed + * @return sanitized string + */ + public String sanitizeName(String name, String removeCharRegEx) { // NOTE: performance wise, we should have written with 2 replaceAll to replace desired // character with _ or empty character. Below aims to spell out different cases we've // encountered so far and hopefully make it easier for others to add more special @@ -3553,9 +3571,9 @@ public String sanitizeName(String name) { // remove everything else other than word, number and _ // $php_variable => php_variable if (allowUnicodeIdentifiers) { //could be converted to a single line with ?: operator - name = Pattern.compile("\\W", Pattern.UNICODE_CHARACTER_CLASS).matcher(name).replaceAll(""); + name = Pattern.compile(removeCharRegEx, Pattern.UNICODE_CHARACTER_CLASS).matcher(name).replaceAll(""); } else { - name = name.replaceAll("\\W", ""); + name = name.replaceAll(removeCharRegEx, ""); } return name; 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 c1a2b1452ee2..e5d200a97b93 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 @@ -516,7 +516,7 @@ public String toApiFilename(String name) { @Override public String toVarName(String name) { // sanitize name - name = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + name = sanitizeName(name, "\\W-[\\$]"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. if (name.toLowerCase().matches("^_*class$")) { return "propertyClass"; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index a9f1a7deaecc..f7880e03c36d 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -18,6 +18,23 @@ public class DefaultCodegenTest { + @Test + public void testCamelize() throws Exception { + Assert.assertEquals(DefaultCodegen.camelize("abcd"), "Abcd"); + Assert.assertEquals(DefaultCodegen.camelize("some-value"), "SomeValue"); + Assert.assertEquals(DefaultCodegen.camelize("some_value"), "SomeValue"); + Assert.assertEquals(DefaultCodegen.camelize("$type"), "$Type"); + + Assert.assertEquals(DefaultCodegen.camelize("abcd", true), "abcd"); + Assert.assertEquals(DefaultCodegen.camelize("some-value", true), "someValue"); + Assert.assertEquals(DefaultCodegen.camelize("some_value", true), "someValue"); + Assert.assertEquals(DefaultCodegen.camelize("Abcd", true), "abcd"); + Assert.assertEquals(DefaultCodegen.camelize("$type", true), "$type"); + + Assert.assertEquals(DefaultCodegen.camelize("123", true), "123"); + Assert.assertEquals(DefaultCodegen.camelize("$123", true), "$123"); + } + @Test public void testHasBodyParameter() throws Exception { final Schema refSchema = new Schema<>().$ref("#/components/schemas/Pet"); @@ -41,7 +58,7 @@ public void testHasBodyParameter() throws Exception { Assert.assertEquals(codegen.hasBodyParameter(openAPI, pingOperation), false); Assert.assertEquals(codegen.hasBodyParameter(openAPI, createOperation), true); } - + @Test public void testGetConsumesInfoAndGetProducesInfo() throws Exception { final DefaultCodegen codegen = new DefaultCodegen(); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java index 1dbd23ac1411..d367266dd364 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java @@ -49,6 +49,23 @@ public void testPreprocessOpenAPI() throws Exception { Assert.assertEquals(openAPI.getPaths().get("/pet").getPost().getExtensions().get("x-accepts"), "application/json"); } + @Test + public void convertVarName() throws Exception { + Assert.assertEquals(fakeJavaCodegen.toVarName("name"), "name"); + Assert.assertEquals(fakeJavaCodegen.toVarName("$name"), "$name"); + Assert.assertEquals(fakeJavaCodegen.toVarName("nam$$e"), "nam$$e"); + Assert.assertEquals(fakeJavaCodegen.toVarName("user-name"), "userName"); + Assert.assertEquals(fakeJavaCodegen.toVarName("user_name"), "userName"); + } + + @Test + public void convertModelName() throws Exception { + Assert.assertEquals(fakeJavaCodegen.toModelName("name"), "Name"); + Assert.assertEquals(fakeJavaCodegen.toModelName("$name"), "Name"); + Assert.assertEquals(fakeJavaCodegen.toModelName("nam#e"), "Name"); + Assert.assertEquals(fakeJavaCodegen.toModelName("$another-fake?"), "AnotherFake"); + } + @Test public void testInitialConfigValues() throws Exception { final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();