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;
+        }
+    }
+}

Reply via email to