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

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

commit f331ddf0ab34bd10f297314b345be18c58e29664
Author: ntimofeev <[email protected]>
AuthorDate: Thu Aug 20 14:00:06 2026 +0300

    cgen schema: missing attribute
---
 .../apache/cayenne/gen/xml/CgenConfigHandler.java  |  4 +
 .../cayenne/gen/xml/CgenConfigHandlerTest.java     | 94 ++++++++++++++++++++++
 .../src/test/resources/cgenRoundTrip.map.xml       | 21 +++++
 .../org/apache/cayenne/schema/13/cgen.xsd          |  1 +
 4 files changed, 120 insertions(+)

diff --git 
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java 
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
index 002cc42d9..4711fafe4 100644
--- 
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
+++ 
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
@@ -106,6 +106,7 @@ public class CgenConfigHandler extends 
NamespaceAwareNestedTagHandler {
                 break;
             case EMBEDDABLE_SUPER_TEMPLATE_TAG:
                 createEmbeddableSuperTemplate(data);
+                break;
             case DATAMAP_TEMPLATE_TAG:
                 createDataMapTemplate(data);
                 break;
@@ -133,6 +134,9 @@ public class CgenConfigHandler extends 
NamespaceAwareNestedTagHandler {
             case SUPER_PKG_TAG:
                 createSuperPkg(data);
                 break;
+            case EXTERNAL_TOOL_CONFIG_TAG:
+                createExternalToolConfig(data);
+                break;
         }
         return true;
     }
diff --git 
a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenConfigHandlerTest.java
 
b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenConfigHandlerTest.java
new file mode 100644
index 000000000..c0e55a359
--- /dev/null
+++ 
b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenConfigHandlerTest.java
@@ -0,0 +1,94 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.gen.xml;
+
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenConfigList;
+import org.apache.cayenne.gen.CgenConfiguration;
+import org.apache.cayenne.gen.TemplateType;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.resource.URLResource;
+import org.apache.cayenne.tools.ToolsInjectorBuilder;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.slf4j.helpers.NOPLogger;
+
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * Checks that a {@code <cgen>} block survives a load, element for element.
+ */
+public class CgenConfigHandlerTest {
+
+    @TempDir
+    static Path tempDir;
+
+    private static CgenConfiguration configuration;
+
+    @BeforeAll
+    public static void loadConfiguration() throws Exception {
+        Path mapFile = tempDir.resolve("cgenRoundTrip.map.xml");
+        try (InputStream in = 
CgenConfigHandlerTest.class.getResourceAsStream("/cgenRoundTrip.map.xml")) {
+            assertNotNull(in, "test DataMap is missing from the classpath");
+            Files.copy(in, mapFile);
+        }
+
+        Injector injector = new ToolsInjectorBuilder()
+                .addModule(new ToolsModule(NOPLogger.NOP_LOGGER))
+                .create();
+
+        DataMap dataMap = injector.getInstance(DataMapLoader.class)
+                .load(new URLResource(mapFile.toUri().toURL()));
+
+        CgenConfigList configurations = 
injector.getInstance(DataChannelMetaData.class)
+                .get(dataMap, CgenConfigList.class);
+        assertNotNull(configurations, "no cgen configuration was loaded");
+
+        configuration = configurations.getByName("Default");
+        assertNotNull(configuration);
+    }
+
+    @Test
+    public void embeddableSuperTemplate() {
+        assertEquals("custom embeddable superclass template", 
configuration.getEmbeddableSuperTemplate().getData());
+        assertEquals(TemplateType.DATAMAP_SUBCLASS.defaultTemplate().getData(),
+                configuration.getDataMapTemplate().getData());
+    }
+
+    @Test
+    public void externalToolConfig() {
+        assertEquals("tools.properties", 
configuration.getExternalToolConfig());
+    }
+
+    @Test
+    public void destDirIsResolved() {
+        assertEquals(tempDir, configuration.getRootPath());
+        assertEquals(tempDir.resolve("../java").normalize(), 
configuration.requireOutputDirectory());
+    }
+}
diff --git a/cayenne-cgen/src/test/resources/cgenRoundTrip.map.xml 
b/cayenne-cgen/src/test/resources/cgenRoundTrip.map.xml
new file mode 100644
index 000000000..6ab64d99c
--- /dev/null
+++ b/cayenne-cgen/src/test/resources/cgenRoundTrip.map.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/13/modelMap";
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+          xsi:schemaLocation="http://cayenne.apache.org/schema/13/modelMap 
https://cayenne.apache.org/schema/13/modelMap.xsd";
+          project-version="13">
+    <obj-entity name="Artist" className="org.example.Artist">
+    </obj-entity>
+    <cgen xmlns="http://cayenne.apache.org/schema/13/cgen";>
+        <name>Default</name>
+        <destDir>../java</destDir>
+        <mode>entity</mode>
+        <embeddableSuperTemplate><![CDATA[custom embeddable superclass 
template]]></embeddableSuperTemplate>
+        <outputPattern>*.java</outputPattern>
+        <makePairs>true</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwrite>false</overwrite>
+        <createPropertyNames>false</createPropertyNames>
+        <createPKProperties>true</createPKProperties>
+        <externalToolConfig>tools.properties</externalToolConfig>
+    </cgen>
+</data-map>
diff --git a/cayenne/src/main/resources/org/apache/cayenne/schema/13/cgen.xsd 
b/cayenne/src/main/resources/org/apache/cayenne/schema/13/cgen.xsd
index cbc5ee823..38e8699b1 100644
--- a/cayenne/src/main/resources/org/apache/cayenne/schema/13/cgen.xsd
+++ b/cayenne/src/main/resources/org/apache/cayenne/schema/13/cgen.xsd
@@ -45,6 +45,7 @@
                     <xs:element name="createPropertyNames" minOccurs="0" 
type="xs:boolean"/>
                     <xs:element name="superPkg" minOccurs="0" 
type="xs:string"/>
                     <xs:element name="createPKProperties" minOccurs="0" 
type="xs:boolean"/>
+                    <xs:element name="externalToolConfig" minOccurs="0" 
type="xs:string"/>
                 </xs:sequence>
         </xs:complexType>
     </xs:element>

Reply via email to