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(); 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 + + + + +