You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2019/07/07 09:39:44 UTC
[cayenne] 01/02: ObjAttributes are not sorted in alphabetical
ordering on save CAY-2595
This is an automated email from the ASF dual-hosted git repository.
aadamchik pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit ee18a5cb463a2d6658659d08967277196b74d16a
Author: Andrus Adamchik <an...@objectstyle.com>
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 c9c30eb..47ea965 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;
+ }
+ }
+}