From e7c3276541ed02f30d6be0469ae5298cad26f537 Mon Sep 17 00:00:00 2001 From: Vhati Date: Sun, 15 Sep 2013 19:33:50 -0400 Subject: [PATCH] Improved sloppy parser exception handling --- skel_common/readme_changelog.txt | 1 + .../vhati/modmanager/core/ModUtilities.java | 13 +- .../modmanager/core/SloppyXMLParser.java | 365 +++++++++--------- 3 files changed, 205 insertions(+), 174 deletions(-) diff --git a/skel_common/readme_changelog.txt b/skel_common/readme_changelog.txt index 76cc96f..5e6de47 100644 --- a/skel_common/readme_changelog.txt +++ b/skel_common/readme_changelog.txt @@ -7,6 +7,7 @@ Changelog - Fixed perpetually green "Update" button - Added --global-panic commandline arg to show mod devs typoed find tags - Added commandline tips in readme_modders.txt +- Fixed sloppy parser Validate error about things not allowed at root 1.2: - Added a commandline interface diff --git a/src/main/java/net/vhati/modmanager/core/ModUtilities.java b/src/main/java/net/vhati/modmanager/core/ModUtilities.java index b8500b4..d64617b 100644 --- a/src/main/java/net/vhati/modmanager/core/ModUtilities.java +++ b/src/main/java/net/vhati/modmanager/core/ModUtilities.java @@ -824,7 +824,7 @@ public class ModUtilities { xmlValid = false; } catch ( Exception e ) { - log.error( "Error while validating mod xml.", e ); + log.error( "Error while validating mod xml with the strict parser.", e ); messages.add( new ReportMessage( ReportMessage.EXCEPTION, "An error occurred. See log for details." @@ -846,6 +846,9 @@ public class ModUtilities { List messages = new ArrayList(); boolean xmlValid = true; + // Meh, the parser's gonna make its own wrapper with declarations anyway. + //text = ""+ text +""; + try { SloppyXMLParser parser = new SloppyXMLParser(); parser.build( text ); @@ -876,6 +879,7 @@ public class ModUtilities { ) ); } else { + log.error( "Error while validating mod xml with the sloppy parser.", e ); messages.add( new ReportMessage( ReportMessage.EXCEPTION, "An error occurred. See log for details." @@ -883,6 +887,13 @@ public class ModUtilities { } xmlValid = false; } + catch ( Exception e ) { + log.error( "Error while validating mod xml with the sloppy parser.", e ); + messages.add( new ReportMessage( + ReportMessage.EXCEPTION, + "An error occurred. See log for details." + ) ); + } return new Report( messages, xmlValid ); } diff --git a/src/main/java/net/vhati/modmanager/core/SloppyXMLParser.java b/src/main/java/net/vhati/modmanager/core/SloppyXMLParser.java index 6446632..1509e3d 100644 --- a/src/main/java/net/vhati/modmanager/core/SloppyXMLParser.java +++ b/src/main/java/net/vhati/modmanager/core/SloppyXMLParser.java @@ -16,6 +16,7 @@ import org.jdom2.Content; import org.jdom2.DefaultJDOMFactory; import org.jdom2.Document; import org.jdom2.Element; +import org.jdom2.IllegalAddException; import org.jdom2.JDOMFactory; import org.jdom2.Namespace; import org.jdom2.Parent; @@ -115,198 +116,216 @@ public class SloppyXMLParser { String tmp = null; Matcher m = declPtn.matcher( s ); - while ( pos > lastPos && pos < sLen ) { - m.region( pos, sLen ); - boolean matchedChunk = false; - - for ( Pattern chunkPtn : chunkPtns ) { - m.usePattern( chunkPtn ); - if ( !m.lookingAt() ) continue; - - if ( chunkPtn == declPtn ) { - // Don't care. - addLineAndCol( lastLineAndCol, m.group(0) ); - } - else if ( chunkPtn == emptyCommentPtn ) { - String whitespace = m.group( 1 ); - if ( whitespace.length() > 0 ) - factory.addContent( parentNode, factory.text( whitespace ) ); - - addLineAndCol( lastLineAndCol, s, m.start(), m.end() ); - } - else if ( chunkPtn == commentPtn ) { - String whitespace = m.group( 1 ); - if ( whitespace.length() > 0 ) - factory.addContent( parentNode, factory.text( whitespace ) ); - - tmp = m.group( 2 ); - if ( tmp.length() == 0 ) { - factory.addContent( parentNode, factory.comment( "" ) ); + try { + while ( pos > lastPos && pos < sLen ) { + m.region( pos, sLen ); + boolean matchedChunk = false; + + for ( Pattern chunkPtn : chunkPtns ) { + m.usePattern( chunkPtn ); + if ( !m.lookingAt() ) continue; + + if ( chunkPtn == declPtn ) { + // Don't care. + addLineAndCol( lastLineAndCol, m.group(0) ); } - else { - Matcher splicedMatcher = Pattern.compile( "(\\s*)