Skip to content

Commit 37be47f

Browse files
MarvGilbjmini
authored andcommitted
[Java] Escaping properties for java (#628)
1 parent 86d7009 commit 37be47f

3 files changed

Lines changed: 63 additions & 0 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ public String toOperationId(String operationId) {
761761
public String toVarName(String name) {
762762
if (reservedWords.contains(name)) {
763763
return escapeReservedWord(name);
764+
} else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains( "" + ((char) character)))) {
765+
return escapeSpecialCharacters(name, null, null);
764766
} else {
765767
return name;
766768
}
@@ -777,6 +779,8 @@ public String toParamName(String name) {
777779
name = removeNonNameElementToCamelCase(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
778780
if (reservedWords.contains(name)) {
779781
return escapeReservedWord(name);
782+
} else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains( "" + ((char) character)))) {
783+
return escapeSpecialCharacters(name, null, null);
780784
}
781785
return name;
782786
}
@@ -815,6 +819,32 @@ public String escapeReservedWord(String name) {
815819
throw new RuntimeException("reserved word " + name + " not allowed");
816820
}
817821

822+
/**
823+
* Return the name with escaped characters.
824+
*
825+
* @param name the name to be escaped
826+
* @param charactersToAllow characters that are not escaped
827+
* @param appdendixToReplacement String to append to replaced characters.
828+
* @return the escaped word
829+
* <p>
830+
* throws Runtime exception as word is not escaped properly.
831+
*/
832+
public String escapeSpecialCharacters(String name, List<String> charactersToAllow, String appdendixToReplacement) {
833+
String result = (String) ((CharSequence) name).chars().mapToObj(c -> {
834+
String character = "" + (char) c;
835+
if (charactersToAllow != null && charactersToAllow.contains(character)) {
836+
return character;
837+
} else if (specialCharReplacements.containsKey(character)) {
838+
return specialCharReplacements.get(character) + (appdendixToReplacement != null ? appdendixToReplacement: "");
839+
} else {
840+
return character;
841+
}
842+
}).reduce( (c1, c2) -> "" + c1 + c2).orElse(null);
843+
844+
if (result != null) return result;
845+
throw new RuntimeException("Word '" + name + "' could not be escaped.");
846+
}
847+
818848
/**
819849
* Return the fully-qualified "Model" name for import
820850
*

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,14 @@ public String toVarName(String name) {
574574
name = name.substring(0, 2).toLowerCase() + name.substring(2);
575575
}
576576

577+
// If name contains special chars -> replace them.
578+
if ((((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains( "" + ((char) character))))) {
579+
List<String> allowedCharacters = new ArrayList<>();
580+
allowedCharacters.add("_");
581+
allowedCharacters.add("$");
582+
name = escapeSpecialCharacters(name, allowedCharacters, "_");
583+
}
584+
577585
// camelize (lower first character) the variable name
578586
// pet_id => petId
579587
name = camelize(name, true);

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,31 @@ public void list2DPropertyTest() {
242242
Assert.assertTrue(property.isContainer);
243243
}
244244

245+
@Test(description = "convert a model with restriced characters")
246+
public void restrictedCharactersPropertiesTest() {
247+
final Schema schema = new Schema()
248+
.description("a sample model")
249+
.addProperties("@Some:restricted%characters#to!handle+", new BooleanSchema());
250+
final DefaultCodegen codegen = new JavaClientCodegen();
251+
final CodegenModel cm = codegen.fromModel("sample", schema, Collections.singletonMap("sample", schema));
252+
253+
Assert.assertEquals(cm.name, "sample");
254+
Assert.assertEquals(cm.classname, "Sample");
255+
Assert.assertEquals(cm.description, "a sample model");
256+
Assert.assertEquals(cm.vars.size(), 1);
257+
258+
final CodegenProperty property = cm.vars.get(0);
259+
Assert.assertEquals(property.baseName, "@Some:restricted%characters#to!handle+");
260+
Assert.assertEquals(property.getter, "getAtSomeColonRestrictedPercentCharactersHashToExclamationHandlePlus");
261+
Assert.assertEquals(property.setter, "setAtSomeColonRestrictedPercentCharactersHashToExclamationHandlePlus");
262+
Assert.assertEquals(property.dataType, "Boolean");
263+
Assert.assertEquals(property.name, "atSomeColonRestrictedPercentCharactersHashToExclamationHandlePlus");
264+
Assert.assertEquals(property.defaultValue, "null");
265+
Assert.assertEquals(property.baseType, "Boolean");
266+
Assert.assertFalse(property.required);
267+
Assert.assertTrue(property.isNotContainer);
268+
}
269+
245270
@Test(description = "convert a model with complex properties")
246271
public void complexPropertiesTest() {
247272
final Schema schema = new Schema()

0 commit comments

Comments
 (0)