How do I find the illegal hex character that halted a MediaWiki XML conversion through Filter Streams?

Progress! It got much further, but still found a place to choke on a “%”. I’ll check to see if there’s an instance of “% O” that’s not in an internal link.

    URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "_O"
    class org.xwiki.filter.FilterException: Failed to parse XML
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:315)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:84)
        at org.xwiki.filter.input.AbstractBeanInputFilterStream.read(AbstractBeanInputFilterStream.java:79)
        at org.xwiki.filter.internal.job.FilterStreamConverterJob.runInternal(FilterStreamConverterJob.java:97)
        at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:243)
        at org.xwiki.job.AbstractJob.run(AbstractJob.java:220)
        at org.xwiki.filter.script.internal.ScriptFilterStreamConverterJob.run(ScriptFilterStreamConverterJob.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: class org.xwiki.filter.FilterException: Failed to convert content page
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.convertToXWiki21(MediaWikiInputFilterStream.java:672)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readPageRevision(MediaWikiInputFilterStream.java:599)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readPage(MediaWikiInputFilterStream.java:452)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readMediaWiki(MediaWikiInputFilterStream.java:356)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:344)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:313)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:84)
        at org.xwiki.filter.input.AbstractBeanInputFilterStream.read(AbstractBeanInputFilterStream.java:79)
        at org.xwiki.filter.internal.job.FilterStreamConverterJob.runInternal(FilterStreamConverterJob.java:97)
        at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:243)
        at org.xwiki.job.AbstractJob.run(AbstractJob.java:220)
        at org.xwiki.filter.script.internal.ScriptFilterStreamConverterJob.run(ScriptFilterStreamConverterJob.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: class java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "_O"
        at java.net.URLDecoder.decode(URLDecoder.java:194)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.toEntityReference(MediaWikiInputFilterStream.java:198)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiContextConverterListener.refactor(MediaWikiContextConverterListener.java:177)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiContextConverterListener.beginLink(MediaWikiContextConverterListener.java:230)
        at org.xwiki.rendering.listener.WrappingListener.beginLink(WrappingListener.java:251)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.LinkEventGenerator.begin(LinkEventGenerator.java:33)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.AbstractEventGenerator.traverse(AbstractEventGenerator.java:88)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:421)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:389)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:367)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:356)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:374)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.WPListBlockEventGenerator.traverseElements(WPListBlockEventGenerator.java:142)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.WPListBlockEventGenerator.traverse(WPListBlockEventGenerator.java:82)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.WPListBlockEventGenerator.traverse(WPListBlockEventGenerator.java:50)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:421)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:389)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:367)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.traverse(EventConverter.java:356)
        at org.xwiki.contrib.mediawiki.syntax.internal.parser.converter.EventConverter.nodesToText(EventConverter.java:232)
        at info.bliki.wiki.model.AbstractWikiModel.render(AbstractWikiModel.java:1245)
        at org.xwiki.contrib.mediawiki.syntax.internal.input.MediaWikiSyntaxInputFilterStream.read(MediaWikiSyntaxInputFilterStream.java:104)
        at org.xwiki.contrib.mediawiki.syntax.internal.input.MediaWikiSyntaxInputFilterStream.read(MediaWikiSyntaxInputFilterStream.java:47)
        at org.xwiki.filter.input.AbstractBeanInputFilterStream.read(AbstractBeanInputFilterStream.java:79)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.convertToXWiki21(MediaWikiInputFilterStream.java:670)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readPageRevision(MediaWikiInputFilterStream.java:599)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readPage(MediaWikiInputFilterStream.java:452)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.readMediaWiki(MediaWikiInputFilterStream.java:356)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:344)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:313)
        at org.xwiki.contrib.mediawiki.xml.internal.input.MediaWikiInputFilterStream.read(MediaWikiInputFilterStream.java:84)
        at org.xwiki.filter.input.AbstractBeanInputFilterStream.read(AbstractBeanInputFilterStream.java:79)
        at org.xwiki.filter.internal.job.FilterStreamConverterJob.runInternal(FilterStreamConverterJob.java:97)
        at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:243)
        at org.xwiki.job.AbstractJob.run(AbstractJob.java:220)
        at org.xwiki.filter.script.internal.ScriptFilterStreamConverterJob.run(ScriptFilterStreamConverterJob.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Finished job of type [filter.converter] with identifier [filter/converter/mediawiki+xml/xwiki+instance]

This does not matches version 1.13. Looks like you are still using previous version. Try to restart XWiki maybe.

Ah. “Upgrade” requires an additional “Continue” to complete. Missed that.

Yes, it starts by explaining to you what it’s going to do (things upgraded, added, removed, etc.).

Success on the import! Thanks again.

On the “Continue” button, in other contexts elsewhere “Continue” means “Done, continue to next task” rather than “Confirm you want to continue with this task.” Minor thing, local cultural difference at most. But I wonder if a less ambiguous word would be clearer to someone like me who is new to the Xwiki context. Or perhaps the “Update” button could be labelled “View proposed changes”, so it would be clear that the “Update” button does not, itself, cause the update to happen.

I know I faced the same issue in the past, we could maybe improve it by asking people if they want to leave page once they clicked on install / upgrade if they’re navigating somewhere else. To ensure they understood it’s not done yet.