James Daugherty created GROOVY-11801:
----------------------------------------

             Summary: Markup Builder no longer executes methods inside of 
closure
                 Key: GROOVY-11801
                 URL: https://issues.apache.org/jira/browse/GROOVY-11801
             Project: Groovy
          Issue Type: Bug
          Components: XML Processing
    Affects Versions: 4.0.29, 4.0.0
            Reporter: James Daugherty


Given this groovyConsole script: 
{code:java}
import groovy.xml.MarkupBuilder
class XmlGenerator {    
     private MarkupBuilder builder = null
    
     String write() {
          Map someData = [
             details: [
                 [
                     myId: 200,
                     breakdowns: [
                         unit: 'test1'
                     ]
                 ]
             ]
         ]  
         
         xmlToString(getWriter(someData))
     } 
     
     String xmlToString(@DelegatesTo(MarkupBuilder) Closure c) {
        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)        
        xml.doubleQuotes = true
        xml.escapeAttributes = true
        xml.mkp.xmlDeclaration(version: "1.0", encoding: "UTF-8")        
builder = xml
        c.delegate = xml
        c.resolveStrategy = Closure.DELEGATE_FIRST
        c.call(xml)        builder = null        writer.toString()
    }
    
    Closure getWriter(Map someData) {
        Closure c = { MarkupBuilder xml ->
            Map parentArgs = [a: '1', b: '2']
            parent(parentArgs) {
                comments {
                    mkp.yield "testing a comment"
                 }
                 
                 for(def someDetails : someData.details) {
                     details(getDetailArgs(someDetails)) {
                         
                     }
                 }
            }
        }
    }
    
    Map getDetailArgs(Map someDetails) {
     [id: someDetails.myId]
    }
}

new XmlGenerator().write() {code}
In Groovy 3.x this generated the following xml: 
{code:java}
<?xml version="1.0" encoding="UTF-8"?>
<parent a="1" b="2">
  <comments>testing a comment</comments>
  <details id="200" />
</parent> {code}
In Groovy 4.x, the method `getDetailArgs` is not being executed so it generates 
this instead: 
{code:java}
<?xml version="1.0" encoding="UTF-8"?>
<parent a="1" b="2">
  <comments>testing a comment</comments>
  <getDetailArgs myId="200" breakdowns="{unit=test1}" />
  <details>getDetailArgs</details>
</parent> {code}
 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to