This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.1 by this push:
     new f6190a518 CAY-2800 Modeler saves map.xml files with schema ordering 
error
f6190a518 is described below

commit f6190a518ca2e4a3a908a490d2d4b67c9d4be467
Author: Nikita Timofeev <[email protected]>
AuthorDate: Fri Mar 17 18:09:04 2023 +0300

    CAY-2800 Modeler saves map.xml files with schema ordering error
---
 RELEASE-NOTES.txt                                  |  1 +
 .../java/org/apache/cayenne/map/ObjEntity.java     | 15 ++++++++++++-
 .../java/org/apache/cayenne/map/ObjEntityTest.java | 26 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5c7876b05..51419dd71 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -23,6 +23,7 @@ CAY-2729 Unable to use custom templates from a folder at 
upper level then datama
 CAY-2730 Duplicating lines in a cgen config saved to datamap.xml
 CAY-2731 Exception when setting a CLOB on H2 v2.0.202
 CAY-2736 Can't use function names as a path in a string-based expression
+CAY-2800 Modeler saves map.xml files with schema ordering error
 
 ----------------------------------
 Release: 4.1.1
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 25c8c7752..e78b84432 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
@@ -146,8 +146,21 @@ public class ObjEntity extends Entity implements 
ObjEntityListener, Configuratio
             encoder.start("qualifier").nested(qualifier, delegate).end();
         }
 
+        // divide attributes by type
+        TreeMap<String, Attribute> embAttributes = new TreeMap<>();
+        TreeMap<String, Attribute> objAttributes = new TreeMap<>();
+
+        attributes.forEach((key, value) -> {
+            if (value instanceof EmbeddedAttribute) {
+                embAttributes.put(key, value);
+            } else {
+                objAttributes.put(key, value);
+            }
+        });
+
         // store attributes
-        encoder.nested(new TreeMap<>(attributes), delegate);
+        encoder.nested(embAttributes, delegate);
+        encoder.nested(objAttributes, 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/ObjEntityTest.java 
b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java
index 920eb8b67..4d53a311b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityTest.java
@@ -55,6 +55,32 @@ public class ObjEntityTest {
                 "</obj-entity>" + ls, out.toString());
     }
 
+    @Test
+    public void testAttributeOrder() {
+        ObjEntity entity = new ObjEntity("X");
+        entity.setClassName("org.example.Xc");
+
+        entity.addAttribute(new ObjAttribute("a2", "java.lang.String", 
entity));
+        entity.addAttribute(new ObjAttribute("a1", "int", entity));
+
+        entity.addAttribute(new EmbeddedAttribute("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 +
+                "<embedded-attribute name=\"a3\" type=\"long\"/>" + ls +
+                "<obj-attribute name=\"a1\" type=\"int\"/>" + ls +
+                "<obj-attribute name=\"a2\" type=\"java.lang.String\"/>" + ls +
+                "</obj-entity>" + ls, out.toString());
+    }
+
     private class EncoderDummyVisitor extends 
BaseConfigurationNodeVisitor<Object> {
         @Override
         public Object visitObjEntity(ObjEntity entity) {

Reply via email to