You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (Jira)" <ji...@apache.org> on 2020/07/28 03:30:00 UTC

[jira] [Resolved] (GROOVY-9664) Groovy 3.0 does not work with Groovy 2 code using groovy.xml.XmlUtil

     [ 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)