set interface with discriminator as parent

If a composed model (allOf) doesn't have any parent and one of its interface has a discriminator field, then set this interface as parent.

See #2096
See https://github.com/swagger-api/swagger-parser/pull/246
This commit is contained in:
cbornet 2016-05-30 18:44:44 +02:00 committed by Tony Tam
parent bd0340327b
commit 8740b4d0ea
3 changed files with 59 additions and 22 deletions

View File

@ -1195,7 +1195,35 @@ public class DefaultCodegen {
allRequired = null; allRequired = null;
} }
// parent model // parent model
final RefModel parent = (RefModel) composed.getParent(); RefModel parent = (RefModel) composed.getParent();
// interfaces (intermediate models)
if (composed.getInterfaces() != null) {
if (m.interfaces == null)
m.interfaces = new ArrayList<String>();
for (RefModel _interface : composed.getInterfaces()) {
Model interfaceModel = null;
if (allDefinitions != null) {
interfaceModel = allDefinitions.get(_interface.getSimpleRef());
}
// set first interface with discriminator found as parent
if (parent == null && interfaceModel instanceof ModelImpl && ((ModelImpl) interfaceModel).getDiscriminator() != null) {
parent = _interface;
} else {
final String interfaceRef = toModelName(_interface.getSimpleRef());
m.interfaces.add(interfaceRef);
addImport(m, interfaceRef);
if (allDefinitions != null) {
if (supportsInheritance) {
addProperties(allProperties, allRequired, interfaceModel, allDefinitions);
} else {
addProperties(properties, required, interfaceModel, allDefinitions);
}
}
}
}
}
if (parent != null) { if (parent != null) {
final String parentRef = parent.getSimpleRef(); final String parentRef = parent.getSimpleRef();
m.parentSchema = parentRef; m.parentSchema = parentRef;
@ -1210,24 +1238,7 @@ public class DefaultCodegen {
} }
} }
} }
// interfaces (intermediate models)
if (composed.getInterfaces() != null) {
if (m.interfaces == null)
m.interfaces = new ArrayList<String>();
for (RefModel _interface : composed.getInterfaces()) {
final String interfaceRef = toModelName(_interface.getSimpleRef());
m.interfaces.add(interfaceRef);
addImport(m, interfaceRef);
if (allDefinitions != null) {
final Model interfaceModel = allDefinitions.get(_interface.getSimpleRef());
if (supportsInheritance) {
addProperties(allProperties, allRequired, interfaceModel, allDefinitions);
} else {
addProperties(properties, required, interfaceModel, allDefinitions);
}
}
}
}
// child model (properties owned by the model itself) // child model (properties owned by the model itself)
Model child = composed.getChild(); Model child = composed.getChild();
if (child != null && child instanceof RefModel && allDefinitions != null) { if (child != null && child instanceof RefModel && allDefinitions != null) {

View File

@ -13,10 +13,14 @@ import com.google.common.collect.Sets;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class JavaInheritanceTest { public class JavaInheritanceTest {
@SuppressWarnings("static-method") @SuppressWarnings("static-method")
@Test(description = "convert a composed model") @Test(description = "convert a composed model with parent")
public void javaInheritanceTest() { public void javaInheritanceTest() {
final Model model = new ComposedModel().parent(new RefModel("Base")) final Model model = new ComposedModel().parent(new RefModel("Base"))
.child(new ModelImpl().additionalProperties(new StringProperty())); .child(new ModelImpl().additionalProperties(new StringProperty()));
@ -29,4 +33,26 @@ public class JavaInheritanceTest {
Assert.assertEquals(cm.parent, "Base"); Assert.assertEquals(cm.parent, "Base");
Assert.assertEquals(cm.imports, Sets.newHashSet("Base")); Assert.assertEquals(cm.imports, Sets.newHashSet("Base"));
} }
@SuppressWarnings("static-method")
@Test(description = "convert a composed model with discriminator")
public void javaInheritanceWithDiscriminatorTest() {
ModelImpl base = new ModelImpl();
base.setDiscriminator("disc");
final Model model = new ComposedModel()
.interfaces(Arrays.asList(new RefModel("Base")))
.child(new ModelImpl().additionalProperties(new StringProperty()));
final Map<String, Model> allDefinitions = new HashMap<String, Model>();
allDefinitions.put("Base", base);
final DefaultCodegen codegen = new JavaClientCodegen();
final CodegenModel cm = codegen.fromModel("sample", model, allDefinitions);
Assert.assertEquals(cm.name, "sample");
Assert.assertEquals(cm.classname, "Sample");
Assert.assertEquals(cm.parent, "Base");
Assert.assertEquals(cm.imports, Sets.newHashSet("Base"));
}
} }

View File

@ -51,7 +51,7 @@ public class JavaScriptInheritanceTest {
Assert.assertEquals(cm.vars.size(), 1); Assert.assertEquals(cm.vars.size(), 1);
Assert.assertEquals(cm.vars.get(0).name, "childProp"); Assert.assertEquals(cm.vars.get(0).name, "childProp");
Assert.assertEquals(cm.allVars.size(), 4); Assert.assertEquals(cm.allVars.size(), 4);
String[] allVars = {"baseProp", "intf1Prop", "intf2Prop", "childProp"}; String[] allVars = {"intf1Prop", "intf2Prop", "baseProp", "childProp"};
for (int i = 0; i < allVars.length; i++) { for (int i = 0; i < allVars.length; i++) {
Assert.assertEquals(cm.allVars.get(i).name, allVars[i]); Assert.assertEquals(cm.allVars.get(i).name, allVars[i]);
} }
@ -91,7 +91,7 @@ public class JavaScriptInheritanceTest {
Assert.assertEquals(cm.imports, Sets.newHashSet("Base", "Interface1", "Interface2")); Assert.assertEquals(cm.imports, Sets.newHashSet("Base", "Interface1", "Interface2"));
Assert.assertEquals(cm.vars.size(), 4); Assert.assertEquals(cm.vars.size(), 4);
Assert.assertEquals(cm.allVars.size(), 4); Assert.assertEquals(cm.allVars.size(), 4);
String[] allVars = {"baseProp", "intf1Prop", "intf2Prop", "childProp"}; String[] allVars = {"intf1Prop", "intf2Prop", "baseProp", "childProp"};
for (int i = 0; i < allVars.length; i++) { for (int i = 0; i < allVars.length; i++) {
Assert.assertEquals(cm.vars.get(i).name, allVars[i]); Assert.assertEquals(cm.vars.get(i).name, allVars[i]);
Assert.assertEquals(cm.allVars.get(i).name, allVars[i]); Assert.assertEquals(cm.allVars.get(i).name, allVars[i]);