Skip to content

Commit

Permalink
Merge pull request #940 from atlassian-forks/child-getter-name-clash
Browse files Browse the repository at this point in the history
Fixes getter and setter name problems for subtypes
  • Loading branch information
HugoMario authored Aug 11, 2021
2 parents 07c653c + 9024a7a commit a48fc03
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1022,11 +1022,15 @@ protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map<String, C
continue;
}
boolean hasConflict = parentModel.vars.stream()
.anyMatch(parentProperty -> parentProperty.name.equals(codegenProperty.name) && !parentProperty.datatype.equals(codegenProperty.datatype));
.anyMatch(parentProperty ->
(parentProperty.name.equals(codegenProperty.name) ||
parentProperty.getGetter().equals(codegenProperty.getGetter()) ||
parentProperty.getSetter().equals(codegenProperty.getSetter()) &&
!parentProperty.datatype.equals(codegenProperty.datatype)));
if (hasConflict) {
codegenProperty.name = toVarName(codegenModel.name + "_" + codegenProperty.name);
codegenProperty.getter = toGetter(codegenProperty.name);
codegenProperty.setter = toGetter(codegenProperty.name);
codegenProperty.setter = toSetter(codegenProperty.name);
break;
}
parentModel = parentModel.parentModel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import io.swagger.codegen.v3.CodegenArgument;
import io.swagger.codegen.v3.CodegenConstants;
import io.swagger.codegen.v3.CodegenModel;
import io.swagger.codegen.v3.CodegenProperty;
import io.swagger.codegen.v3.CodegenType;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
Expand All @@ -10,7 +12,11 @@
import org.testng.Assert;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AbstractJavaCodegenTest {

Expand Down Expand Up @@ -163,6 +169,126 @@ public void testPackageNamesSetWithAdditionalProperties() throws Exception {
Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG), Boolean.TRUE);
}

@Test
public void testFixUpParentAndInterfaces_propertyNameDifferent_getterSetterSame_typeDifferent() {
AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();

CodegenModel parentModel = new CodegenModel();
parentModel.name = "parent_type";
CodegenModel childModel = new CodegenModel();
childModel.name = "child_type";
childModel.parentModel = parentModel;
parentModel.children = new ArrayList<>();

CodegenProperty parentValueProperty1 = new CodegenProperty();
parentValueProperty1.name = "value";
parentValueProperty1.baseName = "value";
parentValueProperty1.getter = "getValue";
parentValueProperty1.setter = "setValue";
parentValueProperty1.datatype = "value_type";
CodegenProperty parentValueProperty2 = new CodegenProperty();
parentValueProperty2.name = "other_value";
parentValueProperty2.baseName = "other_value";
parentValueProperty2.getter = "getOtherValue";
parentValueProperty2.setter = "setOtherValue";
parentValueProperty2.datatype = "other_type";
parentModel.vars = new ArrayList<>();
parentModel.vars.add(parentValueProperty1);
parentModel.vars.add(parentValueProperty2);

CodegenProperty childValueProperty1 = new CodegenProperty();
childValueProperty1.name = "_value"; // different to parent "value"
childValueProperty1.baseName = "_value";
childValueProperty1.getter = "getValue"; // same as parent "getValue"
childValueProperty1.setter = "setValue"; // same as parent "setValue"
childValueProperty1.datatype = "different_type"; // different to parent "value_type"
CodegenProperty childValueProperty2 = new CodegenProperty();
childValueProperty2.name = "third_value";
childValueProperty2.baseName = "third_value";
childValueProperty2.getter = "getThirdValue";
childValueProperty2.setter = "setThirdValue";
childValueProperty2.datatype = "other_type";
childModel.vars = new ArrayList<>();
childModel.vars.add(childValueProperty1);
childModel.vars.add(childValueProperty2);

Map<String, CodegenModel> allModels = new HashMap<>();
allModels.put(parentModel.name, parentModel);
allModels.put(childModel.name, childModel);

codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP);
Assert.assertEquals(childModel.vars.get(0).baseName, "_value");
Assert.assertEquals(childModel.vars.get(0).name, "childTypeValue");
Assert.assertEquals(childModel.vars.get(0).getter, "getChildTypeValue");
Assert.assertEquals(childModel.vars.get(0).setter, "setChildTypeValue");

// unchanged
Assert.assertEquals(childModel.vars.get(1).baseName, childValueProperty2.baseName);
Assert.assertEquals(childModel.vars.get(1).name, childValueProperty2.name);
Assert.assertEquals(childModel.vars.get(1).getter, childValueProperty2.getter);
Assert.assertEquals(childModel.vars.get(1).setter, childValueProperty2.setter);
}

@Test
public void testFixUpParentAndInterfaces_propertyNameSame_getterSetterSame_typeDifferent() {
AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();

CodegenModel parentModel = new CodegenModel();
parentModel.name = "parent_type";
CodegenModel childModel = new CodegenModel();
childModel.name = "child_type";
childModel.parentModel = parentModel;
parentModel.children = new ArrayList<>();

CodegenProperty parentValueProperty1 = new CodegenProperty();
parentValueProperty1.name = "value";
parentValueProperty1.baseName = "value";
parentValueProperty1.getter = "getValue";
parentValueProperty1.setter = "setValue";
parentValueProperty1.datatype = "value_type";
CodegenProperty parentValueProperty2 = new CodegenProperty();
parentValueProperty2.name = "other_value";
parentValueProperty2.baseName = "other_value";
parentValueProperty2.getter = "getOtherValue";
parentValueProperty2.setter = "setOtherValue";
parentValueProperty2.datatype = "other_type";
parentModel.vars = new ArrayList<>();
parentModel.vars.add(parentValueProperty1);
parentModel.vars.add(parentValueProperty2);

CodegenProperty childValueProperty1 = new CodegenProperty();
childValueProperty1.name = "value"; // same as parent "value"
childValueProperty1.baseName = "value";
childValueProperty1.getter = "getValue"; // same as parent "getValue"
childValueProperty1.setter = "setValue"; // same as parent "setValue"
childValueProperty1.datatype = "different_type"; // different to parent "value_type"
CodegenProperty childValueProperty2 = new CodegenProperty();
childValueProperty2.name = "third_value";
childValueProperty2.baseName = "third_value";
childValueProperty2.getter = "getThirdValue";
childValueProperty2.setter = "setThirdValue";
childValueProperty2.datatype = "other_type";
childModel.vars = new ArrayList<>();
childModel.vars.add(childValueProperty1);
childModel.vars.add(childValueProperty2);

Map<String, CodegenModel> allModels = new HashMap<>();
allModels.put(parentModel.name, parentModel);
allModels.put(childModel.name, childModel);

codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP);
Assert.assertEquals(childModel.vars.get(0).baseName, "value");
Assert.assertEquals(childModel.vars.get(0).name, "childTypeValue");
Assert.assertEquals(childModel.vars.get(0).getter, "getChildTypeValue");
Assert.assertEquals(childModel.vars.get(0).setter, "setChildTypeValue");

// unchanged
Assert.assertEquals(childModel.vars.get(1).baseName, childValueProperty2.baseName);
Assert.assertEquals(childModel.vars.get(1).name, childValueProperty2.name);
Assert.assertEquals(childModel.vars.get(1).getter, childValueProperty2.getter);
Assert.assertEquals(childModel.vars.get(1).setter, childValueProperty2.setter);
}

public static class P_AbstractJavaCodegen extends AbstractJavaCodegen {
@Override
public String getArgumentsLocation() {
Expand Down

0 comments on commit a48fc03

Please sign in to comment.