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

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new cd0ee4e67 CAY-2966 "comment" field is lost when upgrading from v10 to 
v12
cd0ee4e67 is described below

commit cd0ee4e674bba693399c39e5f427dd16ff347c90
Author: Andrus Adamchik <[email protected]>
AuthorDate: Thu Jun 25 19:20:17 2026 -0400

    CAY-2966 "comment" field is lost when upgrading from v10 to v12
---
 RELEASE-NOTES.txt                                  |  1 +
 .../project/upgrade/handlers/UpgradeHandler.java   | 58 +++++++++++++++++-----
 .../upgrade/handlers/UpgradeHandler_V11.java       | 20 +-------
 .../upgrade/handlers/UpgradeHandler_V12.java       |  1 +
 .../upgrade/handlers/UpgradeHandler_V12Test.java   | 12 +++++
 .../cayenne/project/upgrade/v12/map1.map.xml       |  1 +
 6 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index c04c01616..bc11eb7cb 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -27,6 +27,7 @@ CAY-2960 Undoing renamed relationship change throws
 CAY-2961 PostgreSQL "text" column is reverse-engineered as CLOB
 CAY-2964 ClassCastException for non-generated meaningful PKs
 CAY-2965 MCP Cgen should not fail on an absent "<cgen>" tag
+CAY-2966 "comment" field is lost when upgrading from v10 to v12
 
 ----------------------------------
 Release: 5.0-M2
diff --git 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java
 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java
index 76dd5ff7a..680a6a4de 100644
--- 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java
+++ 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java
@@ -39,24 +39,28 @@ public interface UpgradeHandler {
 
     /**
      * root tag for the cgen extension
+     *
      * @since 5.0-M1
      */
     String CGEN = "cgen";
 
     /**
      * root tag for the dbImport extension
+     *
      * @since 5.0-M1
      */
     String DB_IMPORT = "dbImport";
 
     /**
      * root tag for the graph extension
+     *
      * @since 5.0-M1
      */
     String GRAPH = "graph";
 
     /**
      * root tag for the validation extension
+     *
      * @since 5.0-M2
      */
     String VALIDATION = "validation";
@@ -86,71 +90,99 @@ public interface UpgradeHandler {
 
     /**
      * Upgrade Domain schema and version info
+     *
      * @param upgradeUnit for the datamap
      */
     default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) {
         Element domain = upgradeUnit.getDocument().getDocumentElement();
         // update schema
-        
domain.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/domain");
-        
domain.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance";);
-        domain.setAttribute("xsi:schemaLocation", 
"http://cayenne.apache.org/schema/"+getVersion()+"/domain " +
-                
"https://cayenne.apache.org/schema/"+getVersion()+"/domain.xsd");
+        domain.setAttribute("xmlns", "http://cayenne.apache.org/schema/"; + 
getVersion() + "/domain");
+        domain.setAttribute("xmlns:xsi", 
"http://www.w3.org/2001/XMLSchema-instance";);
+        domain.setAttribute("xsi:schemaLocation", 
"http://cayenne.apache.org/schema/"; + getVersion() + "/domain " +
+                "https://cayenne.apache.org/schema/"; + getVersion() + 
"/domain.xsd");
         // update version
         domain.setAttribute("project-version", getVersion());
     }
 
     /**
      * Upgrade DataMap schema and version info
+     *
      * @param upgradeUnit for the datamap
      */
     default void updateDataMapSchemaAndVersion(UpgradeUnit upgradeUnit) {
         Element dataMap = upgradeUnit.getDocument().getDocumentElement();
         // update schema
-        
dataMap.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/modelMap");
-        dataMap.setAttribute("xsi:schemaLocation", 
"http://cayenne.apache.org/schema/"+getVersion()+"/modelMap " +
-                
"https://cayenne.apache.org/schema/"+getVersion()+"/modelMap.xsd");
+        dataMap.setAttribute("xmlns", "http://cayenne.apache.org/schema/"; + 
getVersion() + "/modelMap");
+        dataMap.setAttribute("xsi:schemaLocation", 
"http://cayenne.apache.org/schema/"; + getVersion() + "/modelMap " +
+                "https://cayenne.apache.org/schema/"; + getVersion() + 
"/modelMap.xsd");
         // update version
         dataMap.setAttribute("project-version", getVersion());
     }
 
     /**
      * Update schema for the given extension in a datamap file (root element: 
data-map)
+     *
      * @param upgradeUnit a unit to work with
-     * @param extension name of the extension (cgen, dbImport, etc.)
+     * @param extension   name of the extension (cgen, dbImport, etc.)
      */
     default void updateExtensionSchema(UpgradeUnit upgradeUnit, String 
extension) {
         XPath xpath = XPathFactory.newInstance().newXPath();
         NodeList nodes;
         try {
-            nodes = (NodeList) 
xpath.evaluate("/data-map/*[local-name()='"+extension+"']",
+            nodes = (NodeList) xpath.evaluate("/data-map/*[local-name()='" + 
extension + "']",
                     upgradeUnit.getDocument(), XPathConstants.NODESET);
         } catch (XPathExpressionException e) {
             return;
         }
         for (int j = 0; j < nodes.getLength(); j++) {
             Element element = (Element) nodes.item(j);
-            element.setAttribute("xmlns", 
"http://cayenne.apache.org/schema/"+getVersion()+"/"+extension.toLowerCase());
+            element.setAttribute("xmlns", "http://cayenne.apache.org/schema/"; 
+ getVersion() + "/" + extension.toLowerCase());
         }
     }
 
     /**
      * Update schema for the given extension in a project file (root element: 
domain)
+     *
      * @param upgradeUnit a unit to work with
-     * @param extension name of the extension (e.g. validation)
+     * @param extension   name of the extension (e.g. validation)
      * @since 5.0-M2
      */
     default void updateDomainExtensionSchema(UpgradeUnit upgradeUnit, String 
extension) {
         XPath xpath = XPathFactory.newInstance().newXPath();
         NodeList nodes;
         try {
-            nodes = (NodeList) 
xpath.evaluate("/domain/*[local-name()='"+extension+"']",
+            nodes = (NodeList) xpath.evaluate("/domain/*[local-name()='" + 
extension + "']",
                     upgradeUnit.getDocument(), XPathConstants.NODESET);
         } catch (XPathExpressionException e) {
             return;
         }
         for (int j = 0; j < nodes.getLength(); j++) {
             Element element = (Element) nodes.item(j);
-            element.setAttribute("xmlns", 
"http://cayenne.apache.org/schema/"+getVersion()+"/"+extension.toLowerCase());
+            element.setAttribute("xmlns", "http://cayenne.apache.org/schema/"; 
+ getVersion() + "/" + extension.toLowerCase());
+        }
+    }
+
+    /**
+     * Update the version-stamped namespace on {@code info:property} elements
+     * (entity/attribute comments) in a datamap file.
+     *
+     * @param upgradeUnit a unit to work with
+     * @since 5.0
+     */
+    default void updateInfoSchema(UpgradeUnit upgradeUnit) {
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        NodeList nodes;
+        try {
+            nodes = (NodeList) xpath.evaluate("//*[local-name()='property']",
+                    upgradeUnit.getDocument(), XPathConstants.NODESET);
+        } catch (XPathExpressionException e) {
+            return;
+        }
+        for (int j = 0; j < nodes.getLength(); j++) {
+            Element element = (Element) nodes.item(j);
+            if (element.hasAttribute("xmlns:info")) {
+                element.setAttribute("xmlns:info", 
"http://cayenne.apache.org/schema/"; + getVersion() + "/info");
+            }
         }
     }
 }
diff --git 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java
 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java
index bea1ec08f..752fe2f63 100644
--- 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java
+++ 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java
@@ -79,7 +79,7 @@ public class UpgradeHandler_V11 implements UpgradeHandler {
         updateExtensionSchema(upgradeUnit, CGEN);
         updateExtensionSchema(upgradeUnit, DB_IMPORT);
         updateExtensionSchema(upgradeUnit, GRAPH);
-        upgradeComments(upgradeUnit);
+        updateInfoSchema(upgradeUnit);
 
         dropROPProperties(upgradeUnit);
         dropObjEntityClientInfo(upgradeUnit);
@@ -88,24 +88,6 @@ public class UpgradeHandler_V11 implements UpgradeHandler {
         updateDbImportConfig(upgradeUnit);
     }
 
-    private void upgradeComments(UpgradeUnit upgradeUnit) {
-        XPath xpath = XPathFactory.newInstance().newXPath();
-        NodeList infoNodes;
-        try {
-            infoNodes = (NodeList) 
xpath.evaluate("//*[local-name()='property']",
-                    upgradeUnit.getDocument(), XPathConstants.NODESET);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        for (int j = 0; j < infoNodes.getLength(); j++) {
-            Element infoElement = (Element) infoNodes.item(j);
-            if (infoElement.hasAttribute("xmlns:info")) {
-                infoElement.setAttribute("xmlns:info", 
"http://cayenne.apache.org/schema/11/info";);
-            }
-        }
-    }
-
     private void dropROPProperties(UpgradeUnit upgradeUnit) {
         Element dataMap = upgradeUnit.getDocument().getDocumentElement();
         NodeList propertyNodes;
diff --git 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12.java
 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12.java
index 1eccb0a10..d5c56f183 100644
--- 
a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12.java
+++ 
b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12.java
@@ -62,6 +62,7 @@ public class UpgradeHandler_V12 implements UpgradeHandler {
         updateDataMapSchemaAndVersion(upgradeUnit);
         updateExtensionSchema(upgradeUnit, CGEN);
         updateExtensionSchema(upgradeUnit, DB_IMPORT);
+        updateInfoSchema(upgradeUnit);
     }
 
     private void removeGraphIncludes(UpgradeUnit upgradeUnit) {
diff --git 
a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12Test.java
 
b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12Test.java
index c755f706c..a2394069e 100644
--- 
a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12Test.java
+++ 
b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V12Test.java
@@ -113,6 +113,18 @@ public class UpgradeHandler_V12Test extends 
BaseUpgradeHandlerTest {
         assertEquals(1, dbImport.getLength());
         assertEquals("http://cayenne.apache.org/schema/12/dbimport";,
                 ((Element) dbImport.item(0)).getAttribute("xmlns"));
+
+        NodeList properties = (NodeList) 
xpath.evaluate("//*[local-name()='property']",
+                document, XPathConstants.NODESET);
+        int infoComments = 0;
+        for (int i = 0; i < properties.getLength(); i++) {
+            Element property = (Element) properties.item(i);
+            if (property.hasAttribute("xmlns:info")) {
+                infoComments++;
+                assertEquals("http://cayenne.apache.org/schema/12/info";, 
property.getAttribute("xmlns:info"));
+            }
+        }
+        assertEquals(1, infoComments, "info:property comment must be preserved 
and namespace-bumped");
     }
 
     @Test
diff --git 
a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v12/map1.map.xml
 
b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v12/map1.map.xml
index c34c87c39..368754da1 100644
--- 
a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v12/map1.map.xml
+++ 
b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v12/map1.map.xml
@@ -6,6 +6,7 @@
        <property name="defaultPackage" value="org.apache.cayenne.x"/>
        <db-entity name="db_entity">
                <db-attribute name="untitledAttr" type="INTEGER" 
isPrimaryKey="true" isMandatory="true"/>
+               <info:property 
xmlns:info="http://cayenne.apache.org/schema/11/info"; name="comment" 
value="mixed case column names"/>
        </db-entity>
        <db-entity name="db_entity1">
                <db-attribute name="untitledAttr" type="INTEGER" 
isPrimaryKey="true" isMandatory="true"/>

Reply via email to