This is an automated email from the ASF dual-hosted git repository. aadamchik pushed a commit to branch STABLE-4.1 in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 1133d9086305c0f0629e403d8119a4c1f57608b3 Author: Andrus Adamchik <[email protected]> AuthorDate: Sun Jul 7 12:22:31 2019 +0300 ObjAttributes are not sorted in alphabetical ordering on save CAY-2595 --- .../java/org/apache/cayenne/map/ObjEntity.java | 2 +- .../java/org/apache/cayenne/map/DbEntityTest.java | 59 ++++++++++++++++++++++ .../java/org/apache/cayenne/map/ObjEntityTest.java | 56 ++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java index 74e793d..2ef0c4b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java @@ -147,7 +147,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio } // store attributes - encoder.nested(getDeclaredAttributes(), delegate); + encoder.nested(new TreeMap<>(attributes), delegate); for (Map.Entry<String, String> override : attributeOverrides.entrySet()) { encoder.start("attribute-override") diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java new file mode 100644 index 0000000..ae98214 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityTest.java @@ -0,0 +1,59 @@ +package org.apache.cayenne.map; + +import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor; +import org.apache.cayenne.util.XMLEncoder; +import org.junit.Test; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Types; + +import static org.junit.Assert.*; + +public class DbEntityTest { + + @Test + public void testEncodeAsXML() { + DbEntity entity = new DbEntity("X"); + entity.setSchema("s"); + entity.setCatalog("c"); + + // intentionally randomize attribute order .. must be saved in alphabetical order by name + entity.addAttribute(new DbAttribute("a2", Types.VARCHAR, entity)); + entity.addAttribute(new DbAttribute("a1", Types.INTEGER, entity)); + entity.addAttribute(new DbAttribute("a3", Types.BIGINT, entity)); + + // relationships are saved outside the entity, so should be ignored in this test + entity.addRelationship(new DbRelationship("r1")); + + StringWriter out = new StringWriter(); + XMLEncoder encoder = new XMLEncoder(new PrintWriter(out)); + entity.encodeAsXML(encoder, new EncoderDummyVisitor()); + + String ls = System.lineSeparator(); + + assertEquals("<db-entity name=\"X\" schema=\"s\" catalog=\"c\">" + ls + + "<db-attribute name=\"a1\" type=\"INTEGER\"/>" + ls + + "<db-attribute name=\"a2\" type=\"VARCHAR\"/>" + ls + + "<db-attribute name=\"a3\" type=\"BIGINT\"/>" + ls + + "</db-entity>" + ls, out.toString()); + } + + private class EncoderDummyVisitor extends BaseConfigurationNodeVisitor<Object> { + + @Override + public Object visitDbEntity(DbEntity entity) { + return null; + } + + @Override + public Object visitDbAttribute(DbAttribute attribute) { + return null; + } + + @Override + public Object visitDbRelationship(DbRelationship relationship) { + return null; + } + } +} diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java new file mode 100644 index 0000000..032794f --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java @@ -0,0 +1,56 @@ +package org.apache.cayenne.map; + +import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor; +import org.apache.cayenne.util.XMLEncoder; +import org.junit.Test; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.junit.Assert.*; + +public class ObjEntityTest { + + @Test + public void testEncodeAsXML() { + ObjEntity entity = new ObjEntity("X"); + entity.setClassName("org.example.Xc"); + + // intentionally randomize attribute order .. must be saved in alphabetical order by name + entity.addAttribute(new ObjAttribute("a2", "java.lang.String", entity)); + entity.addAttribute(new ObjAttribute("a1", "int", entity)); + entity.addAttribute(new ObjAttribute("a3", "long", entity)); + + // relationships are saved outside the entity, so should be ignored in this test + entity.addRelationship(new ObjRelationship("r1")); + + StringWriter out = new StringWriter(); + XMLEncoder encoder = new XMLEncoder(new PrintWriter(out)); + entity.encodeAsXML(encoder, new EncoderDummyVisitor()); + + String ls = System.lineSeparator(); + + assertEquals("<obj-entity name=\"X\" className=\"org.example.Xc\">" + ls + + "<obj-attribute name=\"a1\" type=\"int\"/>" + ls + + "<obj-attribute name=\"a2\" type=\"java.lang.String\"/>" + ls + + "<obj-attribute name=\"a3\" type=\"long\"/>" + ls + + "</obj-entity>" + ls, out.toString()); + } + + private class EncoderDummyVisitor extends BaseConfigurationNodeVisitor<Object> { + @Override + public Object visitObjEntity(ObjEntity entity) { + return null; + } + + @Override + public Object visitObjAttribute(ObjAttribute attribute) { + return null; + } + + @Override + public Object visitObjRelationship(ObjRelationship relationship) { + return null; + } + } +}
