diff --git a/changelog.adoc b/changelog.adoc index 895da3c87..4099db9b6 100644 --- a/changelog.adoc +++ b/changelog.adoc @@ -27,7 +27,8 @@ * Choice dialog is not localized for some locales. Replace with an equivalent or submit upstream patch == Release 2.36.2 -* 02/10/2019 Update to the latest Hibernate, Netty, and HikariCP dependencies +* 02/10/2019 Prevent an exception when importing odd OFX files using an XML declaration. (GitHub Issue #72) +* 02/10/2019 Update to the latest Hibernate, Netty, and HikariCP dependencies. This improves compatibility with Java 9+. * 01/14/2019 jGnash would not start on a early access version of Java 8 (Swing, Fx, GitHub Issue #71) * 01/11/2019 Corrected an exception when the date picker was cleared and focus was lost (Fx, GitHub PR #70) _[pchurzin]_ * 12/24/2018 Updated Polish translation (Swing, Fx) _[Sławomir Szarkowicz]_ diff --git a/jgnash-convert/src/main/java/jgnash/convert/importat/ofx/Sanitize.java b/jgnash-convert/src/main/java/jgnash/convert/importat/ofx/Sanitize.java index 75f3cd74e..816e21eb6 100644 --- a/jgnash-convert/src/main/java/jgnash/convert/importat/ofx/Sanitize.java +++ b/jgnash-convert/src/main/java/jgnash/convert/importat/ofx/Sanitize.java @@ -19,6 +19,8 @@ /** * Utility class for handling OFX files with invalid characters + * + * @author Craig Cavanaugh */ class Sanitize { @@ -36,6 +38,9 @@ private Sanitize() { static String sanitize(final String xml) { String ugly = xml; + // remove all XML declarations as they are not needed + ugly = ugly.replaceAll("<\\?xml.*\\?>", ""); + ugly = ugly.replaceAll("&(?!(?:amp);)", "&"); ugly = ugly.replaceAll("\"", """); ugly = ugly.replaceAll("'", "'"); diff --git a/jgnash-convert/src/test/java/jgnash/convert/importat/ofx/Ofx2Test.java b/jgnash-convert/src/test/java/jgnash/convert/importat/ofx/Ofx2Test.java index c3282a6ce..34f345ed2 100644 --- a/jgnash-convert/src/test/java/jgnash/convert/importat/ofx/Ofx2Test.java +++ b/jgnash-convert/src/test/java/jgnash/convert/importat/ofx/Ofx2Test.java @@ -477,6 +477,43 @@ void parse401k() { } } + @Test + void parse401kWithHeader() { + final String testFile = "/401k-header.xml"; + + final URL url = Ofx2Test.class.getResource(testFile); + + try { + assertTrue(FileMagic.isOfxV2(Paths.get(url.toURI()))); + + try (final InputStream stream = Ofx2Test.class.getResourceAsStream(testFile)) { + parser.parse(stream); + + OfxBank ofxBank = parser.getBank(); + + assertEquals("ENG", parser.getLanguage()); + assertEquals("INFO", parser.getStatusSeverity()); + assertEquals(0, parser.getStatusCode()); + + assertEquals(0, ofxBank.statusCode); + assertEquals("INFO", ofxBank.statusSeverity); + assertNull(ofxBank.statusMessage); + + assertEquals(3, ofxBank.getTransactions().size()); + assertEquals(3, ofxBank.getSecurityList().size()); + + + assertTrue(ofxBank.isInvestmentAccount()); + } catch (final IOException e) { + logSevere(Ofx2Test.class, e); + fail(); + } + } catch (final URISyntaxException e) { + logSevere(Ofx2Test.class, e); + fail(); + } + } + @Test void parseInvest2() { final String testFile = "/invest2.xml"; diff --git a/jgnash-convert/src/test/resources/401k-header.xml b/jgnash-convert/src/test/resources/401k-header.xml new file mode 100644 index 000000000..a3affd008 --- /dev/null +++ b/jgnash-convert/src/test/resources/401k-header.xml @@ -0,0 +1,233 @@ + + + + + + 0 + INFO + + 20060131172532 + ENG + 20060131172532 + 20060131172532 + + NCH + 1001 + + + + + + 1002 + + 0 + INFO + + + 20060131172605.000[-4:EST] + USD + + 121099999 + 999988 + + + 20060105172532.000[-5:EST] + 20060131172532.000[-4:EST] + + + + 212839062820295310723 + 20060119000000.000[-5:EST] + + + 744316100 + CUSIP + + 14.6860 + 18.9000 + -277.5700 + + 1.0000 + USD + + OTHER + OTHER + 2 + 277.5700 + 0.0000 + ROLLOVER + 20060114000000.000[-5:EST] + N + + BUY + + + + + 212839062820510822977 + 20060119000000.000[-5:EST] + + + 744316100 + CUSIP + + 2.0220 + 18.9000 + -38.2200 + + 1.0000 + USD + + OTHER + OTHER + 2 + 0.0000 + 38.2200 + ROLLOVER + 20060114000000.000[-5:EST] + N + + BUY + + + + + 212849815151950488609 + 20060106000000.000[-5:EST] + + + 744316100 + CUSIP + + 4.9010 + 18.7900 + -92.0900 + + 1.0000 + USD + + OTHER + OTHER + PRETAX + 20051231000000.000[-5:EST] + Y + + BUY + + + + 31690.340000 + 10725.640000 + 15945.750000 + 108.800000 + 58470.530000 + + + ELGIN NATIONAL INDUSTRIES INC + 4343 + 19940101000000.000[-5:EST] + + 0.00 + + + + + 744316100 + CUSIP + + 50.0000 + 100.0000 + + 100.0000 + 100.0000 + + + + 74431M105 + CUSIP + + 25.0000 + 0.0000 + + 0.0000 + 0.0000 + + + + 743969107 + CUSIP + + 25.0000 + 0.0000 + + 0.0000 + 0.0000 + + + + + 20060101000000 + 20060131000000 + + 843.2500 + 43.4200 + 421.6200 + 1308.2900 + + + + + + + + + + + + + 123456789 + CUSIP + + Acme Development, Inc. + ACME + 1024 + + 10 + SMALLSTOCK + + + + + 666678578 + CUSIP + + Hackson Unlimited, Inc. + HACK + 1027 + + 17 + SMALLSTOCK + + + + + 000342222 + CUSIP + + Lucky Airlines Jan 97 Put + LUAXX + 0013 + + PUT + 35.00 + 20050121 + 100 + + 000342200 + CUSIP + + LARGESTOCK + + + + \ No newline at end of file