[ 
https://issues.apache.org/jira/browse/GROOVY-9664?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King resolved GROOVY-9664.
-------------------------------
    Fix Version/s: 3.0.6
         Assignee: Paul King
       Resolution: Fixed

Indeed, as you discovered, using {{groovy.util.XmlUtil}} is the recommended 
approach if sticking with the legacy {{groovy.util.XmlSlurper}} class.

Having said that, {{groovy.xml.XmlUtil}} now also works with some trickery to 
avoid referencing the legacy {{GPathResult}} class which would be a negative 
from a JPMS point of view.

> Groovy 3.0 does not work with Groovy 2 code using groovy.xml.XmlUtil
> --------------------------------------------------------------------
>
>                 Key: GROOVY-9664
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9664
>             Project: Groovy
>          Issue Type: Bug
>          Components: XML Processing
>    Affects Versions: 3.0.5
>            Reporter: Dan Ziemba
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 3.0.6
>
>
> I am trying to upgrade a project from Groovy 2.5.12 to 3.0.5, but am running 
> into trouble with an unmaintained library that is built against Groovy 2.4.1. 
>  Part of what this library does includes using XmlSlurper to parse an XML 
> string, then using XmlUtil to serialize one of the nodes back to an XML 
> string. 
> This is the simplified example that reproduces the problem:
> {code:groovy}
> import groovy.util.slurpersupport.NodeChild
> import groovy.util.XmlSlurper
> import groovy.xml.XmlUtil
> String xml = '<xml 
> xmlns="http://example.com/ns";><abc><xyz>true</xyz></abc></xml>'
> String name = "abc"
> // Note NodeChild and XmlSlurper are both deprecated in Groovy 3
> NodeChild parsed = new XmlSlurper().parseText(xml)
> def node = parsed."$name"
> // Just to show type of 'node'
> println "Node class: ${node.getClass()}"
> println "Node super class: ${node.getClass().getSuperclass()}"
> // Error happens here
> println "Result: ${XmlUtil.serialize(node)}"
> {code}
> This is the expected output when running with Groovy 2.5.12:
> {noformat}
> Node class: class groovy.util.slurpersupport.NodeChildren
> Node super class: class groovy.util.slurpersupport.GPathResult
> Result: <?xml version="1.0" encoding="UTF-8"?>
> <tag0:abc xmlns:tag0="http://example.com/ns";>
>    <tag0:xyz>true</tag0:xyz>
> </tag0:abc>
> {noformat}
> The same code fails when running with Groovy 3.0.5:
> {noformat}
> Node class: class groovy.util.slurpersupport.NodeChildren
> Node super class: class groovy.util.slurpersupport.GPathResult
> Error on line 1 column 1 
>   SXXP0003  Error reported by XML parser: Content is not allowed in prolog.
> groovy.lang.GroovyRuntimeException: org.xml.sax.SAXParseException; 
> lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
>       at groovy.xml.XmlUtil.serialize(XmlUtil.java:458)
>       at groovy.xml.XmlUtil.serialize(XmlUtil.java:444)
>       at groovy.xml.XmlUtil.serialize(XmlUtil.java:191)
>       at groovy.xml.XmlUtil.serialize(XmlUtil.java:160)
>       at groovy.xml.XmlUtil$serialize.call(Unknown Source)
>       at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
>       at ideaGroovyConsole.run(ideaGroovyConsole.groovy:17)
> {noformat}
> The problem relates to GROOVY-4285.  The method 
> {{groovy.xml.XmlUtil#asString(groovy.lang.Writable)}} has changed its 
> instanceof check to check for {{groovy.xml.slurpersupport.GPathResult}}, but 
> the now-deprecated XmlSlurper still returns a sub-class of 
> {{groovy.util.slurpersupport.GPathResult}}.  So the check fails, leading to 
> the same problem described in the old issue GROOVY-4285.
> I see that there is now a deprecated "groovy.util.XmlUtil" class, and the 
> code works if changed to that, but that class did not exist before Groovy 3.  
> I think "groovy.xml.XmlUtil" should be fixed so that code using the 
> deprecated APIs is still able to run unchanged as long as those deprecated 
> API continue to exist.  Perhaps {{groovy.xml.XmlUtil}} could be changed to 
> check for the old version of GPathResult and call {{groovy.util.XmlUtil}} as 
> appropriate? 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to