This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch STABLE-4.2
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
new 502362747 CAY-2800 Modeler saves map.xml files with schema ordering
error
502362747 is described below
commit 50236274793f3d42fd95fa5220779a838c0e49b8
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 5321c62d8..7a8f439be 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -24,6 +24,7 @@ CAY-2790 EOModel import: NPE importing EOFetchSpecification
CAY-2792 Fix Insertion Order For Reflexive DataObjects
CAY-2794 Fix Incorrect JavaType for Vertical-Inheritance Attributes
CAY-2796 Cayenne custom json formatter produces invalid json
+CAY-2800 Modeler saves map.xml files with schema ordering error
CAY-2801 Incorrect equals() implementation in IdGenerationMarker could cause
data missing in the commit
----------------------------------
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 2ffaabf1c..d0d2500b1 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
@@ -149,8 +149,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) {