From 1b391d151488a4f0e86bc7e1b77bdc753dcd8bea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:48:27 +0000 Subject: [PATCH 1/3] Fix Root class name conflict in JDOM writer by renaming local variable to rootElement Co-authored-by: slachiewicz <6705942+slachiewicz@users.noreply.github.com> --- .../plugin/jdom/JDOMWriterGenerator.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/modello-plugins/modello-plugin-jdom/src/main/java/org/codehaus/modello/plugin/jdom/JDOMWriterGenerator.java b/modello-plugins/modello-plugin-jdom/src/main/java/org/codehaus/modello/plugin/jdom/JDOMWriterGenerator.java index c7435cb17..1985e4f26 100644 --- a/modello-plugins/modello-plugin-jdom/src/main/java/org/codehaus/modello/plugin/jdom/JDOMWriterGenerator.java +++ b/modello-plugins/modello-plugin-jdom/src/main/java/org/codehaus/modello/plugin/jdom/JDOMWriterGenerator.java @@ -487,19 +487,19 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway String namespace = xmlModelMetadata.getNamespace(getGeneratedVersion()); if (namespace != null) { - sc.add("Element root = factory.element( xmlTag, \"" + namespace + "\" );"); + sc.add("Element rootElement = factory.element( xmlTag, \"" + namespace + "\" );"); if (xmlModelMetadata.getSchemaLocation() != null) { String url = xmlModelMetadata.getSchemaLocation(getGeneratedVersion()); sc.add( "Namespace xsins = Namespace.getNamespace( \"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\" );"); - sc.add("root.setAttribute( \"schemaLocation\", \"" + namespace + " " + url + "\", xsins );"); + sc.add("rootElement.setAttribute( \"schemaLocation\", \"" + namespace + " " + url + "\", xsins );"); } } else { - sc.add("Element root = factory.element( xmlTag );"); + sc.add("Element rootElement = factory.element( xmlTag );"); } - sc.add("document.setRootElement( root );"); + sc.add("document.setRootElement( rootElement );"); } else { - sc.add("Element root = updateElement( counter, element, xmlTag );"); + sc.add("Element rootElement = updateElement( counter, element, xmlTag );"); } sc.add("Counter innerCount = new Counter( counter.getDepth() + 1 );"); @@ -528,7 +528,7 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway if (xmlFieldMetadata.isAttribute()) { sc.add(getValueChecker(type, value, field)); sc.add("{"); - sc.addIndented("root.setAttribute( \"" + fieldTagName + "\", " + sc.addIndented("rootElement.setAttribute( \"" + fieldTagName + "\", " + getValue(field.getType(), value, xmlFieldMetadata) + " );"); sc.add("}"); continue; @@ -541,7 +541,7 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway sc.add(getValueChecker(type, value, field)); sc.add("{"); sc.addIndented("update" + capitalise(field.getType()) + "( " + value + ", \"" + fieldTagName - + "\", innerCount, root );"); + + "\", innerCount, rootElement );"); sc.add("}"); } else { // MANY_MULTIPLICITY @@ -559,26 +559,27 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway String toType = association.getTo(); if (toClass != null) { if (xmlAssociationMetadata.isWrappedItems()) { - sc.add("iterate" + capitalise(toType) + "( innerCount, root, " + value + ",\"" + sc.add("iterate" + capitalise(toType) + "( innerCount, rootElement, " + value + ",\"" + fieldTagName + "\",\"" + valuesTagName + "\" );"); createIterateMethod(field.getName(), toClass, singular(fieldTagName), jClass); } else { // assume flat.. - sc.add("iterate2" + capitalise(toType) + "( innerCount, root, " + value + ", \"" + sc.add("iterate2" + capitalise(toType) + "( innerCount, rootElement, " + value + ", \"" + valuesTagName + "\" );"); createIterateMethod2(field.getName(), toClass, singular(fieldTagName), jClass); } } else { // list of strings? - sc.add("findAndReplaceSimpleLists( innerCount, root, " + value + ", \"" + fieldTagName - + "\", \"" + singular(fieldTagName) + "\" );"); + sc.add("findAndReplaceSimpleLists( innerCount, rootElement, " + value + ", \"" + + fieldTagName + "\", \"" + singular(fieldTagName) + "\" );"); } } else { // Map or Properties sc.add(getValueChecker(type, value, field)); sc.add("{"); sc.indent(); - sc.add("Element listElement = updateElement( innerCount, root, \"" + fieldTagName + "\" );"); + sc.add("Element listElement = updateElement( innerCount, rootElement, \"" + fieldTagName + + "\" );"); sc.add("Iterator it = " + value + ".keySet().iterator();"); sc.add("Counter propertiesCounter = new Counter( innerCount.getDepth() + 1 );"); sc.add("while ( it.hasNext() )"); @@ -604,14 +605,14 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway } } else { if ("DOM".equals(field.getType())) { - sc.add("findAndReplaceXpp3DOM( innerCount, root, \"" + fieldTagName + "\", (Xpp3Dom) " + value - + " );"); + sc.add("findAndReplaceXpp3DOM( innerCount, rootElement, \"" + fieldTagName + "\", (Xpp3Dom) " + + value + " );"); requiresDomSupport = true; } else { sc.add(getValueChecker(type, value, field)); sc.add("{"); - sc.addIndented("updateElement( innerCount, root, \"" + fieldTagName + "\" ).setText( " + sc.addIndented("updateElement( innerCount, rootElement, \"" + fieldTagName + "\" ).setText( " + getValue(field.getType(), value, xmlFieldMetadata) + " );"); sc.add("}"); } @@ -620,7 +621,7 @@ private void updateClass(ModelClass clazz, JClass jClass, List alway if (contentField != null) { XmlFieldMetadata xmlFieldMetadata = (XmlFieldMetadata) contentField.getMetadata(XmlFieldMetadata.ID); - sc.add("root.setText( " + getValue(contentField.getType(), contentValue, xmlFieldMetadata) + " );"); + sc.add("rootElement.setText( " + getValue(contentField.getType(), contentValue, xmlFieldMetadata) + " );"); } sc.unindent(); From 476e45fe5efae929961758d15d94fef3655c83d7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:51:58 +0000 Subject: [PATCH 2/3] Add test case for Root class name in JDOM writer Co-authored-by: slachiewicz <6705942+slachiewicz@users.noreply.github.com> --- .../jdom/RootClassnameJDOMGeneratorTest.java | 56 +++++++++++++++++++ .../src/main/resources/root-classname.mdo | 56 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 modello-plugins/modello-plugin-jdom/src/test/java/org/codehaus/modello/plugin/jdom/RootClassnameJDOMGeneratorTest.java create mode 100644 modello-test/src/main/resources/root-classname.mdo diff --git a/modello-plugins/modello-plugin-jdom/src/test/java/org/codehaus/modello/plugin/jdom/RootClassnameJDOMGeneratorTest.java b/modello-plugins/modello-plugin-jdom/src/test/java/org/codehaus/modello/plugin/jdom/RootClassnameJDOMGeneratorTest.java new file mode 100644 index 000000000..4fe33fd24 --- /dev/null +++ b/modello-plugins/modello-plugin-jdom/src/test/java/org/codehaus/modello/plugin/jdom/RootClassnameJDOMGeneratorTest.java @@ -0,0 +1,56 @@ +package org.codehaus.modello.plugin.jdom; + +/* + * 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 + * + * http://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. + */ + +import java.util.Map; + +import org.codehaus.modello.AbstractModelloJavaGeneratorTest; +import org.codehaus.modello.core.ModelloCore; +import org.codehaus.modello.model.Model; + +/** + * Test for issue where "Root" cannot be used as a class name in JDOM writer. + * The generated code would have a variable name conflict between the method parameter + * and a local variable both named "root". + * + * @author Copilot + */ +public class RootClassnameJDOMGeneratorTest extends AbstractModelloJavaGeneratorTest { + public RootClassnameJDOMGeneratorTest() { + super("root-classname"); + } + + public void testJavaGenerator() throws Throwable { + ModelloCore modello = (ModelloCore) lookup(ModelloCore.ROLE); + + Model model = modello.loadModel(getXmlResourceReader("/root-classname.mdo")); + + Map parameters = getModelloParameters("1.0.0"); + + modello.generate(model, "java", parameters); + modello.generate(model, "jdom-writer", parameters); + + addDependency("org.jdom", "jdom"); + compileGeneratedSources(); + + // If the code compiles successfully, the test passes + // The compilation would fail if there was a variable name conflict + } +} diff --git a/modello-test/src/main/resources/root-classname.mdo b/modello-test/src/main/resources/root-classname.mdo new file mode 100644 index 000000000..2f2bd912f --- /dev/null +++ b/modello-test/src/main/resources/root-classname.mdo @@ -0,0 +1,56 @@ + + + + + + root-classname + RootClassname + Test model for issue where Root cannot be used as a class name + + + package + org.codehaus.modello.generator.xml.rootclassname + + + + + Root + 1.0.0+ + Root element class named Root to test variable naming conflict + + + name + 1.0.0+ + String + Test field + + + version + 1.0.0+ + String + Another test field + + + + + From 890036f3498ed3a5ca705ac88e0260da6c07e87e Mon Sep 17 00:00:00 2001 From: Sylwester Lachiewicz Date: Tue, 7 Oct 2025 20:31:43 +0200 Subject: [PATCH 3/3] Revert "Root" root element --- .../src/it/javadoc/src/main/mdo/model.mdo | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modello-maven-plugin/src/it/javadoc/src/main/mdo/model.mdo b/modello-maven-plugin/src/it/javadoc/src/main/mdo/model.mdo index 3f2f8f3c7..16e8f1898 100644 --- a/modello-maven-plugin/src/it/javadoc/src/main/mdo/model.mdo +++ b/modello-maven-plugin/src/it/javadoc/src/main/mdo/model.mdo @@ -1,12 +1,12 @@ - - TestRoot + Root 1.0.0+ @@ -75,12 +75,12 @@ Interface - + Location 1.0.0+ - + Source 1.0.0+