From 2af2fa28c25b773a74a108276761427b8d7b8486 Mon Sep 17 00:00:00 2001 From: David North Date: Wed, 19 Aug 2015 11:10:13 +0000 Subject: [PATCH] Improve ReadOnlySharedStringsTable to cope gracefully with an empty SST part. https://bz.apache.org/bugzilla/show_bug.cgi?id=58262 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1696559 13f79535-47bb-0310-9956-ffa450edef68 --- .../ReadOnlySharedStringsTable.java | 16 +++++++----- .../TestReadOnlySharedStringsTable.java | 24 ++++++++++++++++++ .../spreadsheet/noSharedStringTable.xlsx | Bin 0 -> 7820 bytes 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100755 test-data/spreadsheet/noSharedStringTable.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java index 5263473bca..24e2c649d3 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java @@ -132,13 +132,15 @@ public class ReadOnlySharedStringsTable extends DefaultHandler { * @throws ParserConfigurationException */ public void readFrom(InputStream is) throws IOException, SAXException { - InputSource sheetSource = new InputSource(is); - try { - XMLReader sheetParser = SAXHelper.newXMLReader(); - sheetParser.setContentHandler(this); - sheetParser.parse(sheetSource); - } catch(ParserConfigurationException e) { - throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage()); + if (is.available() > 0) { + InputSource sheetSource = new InputSource(is); + try { + XMLReader sheetParser = SAXHelper.newXMLReader(); + sheetParser.setContentHandler(this); + sheetParser.parse(sheetSource); + } catch(ParserConfigurationException e) { + throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage()); + } } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java index c4690369b9..ad8470baba 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java @@ -20,12 +20,16 @@ package org.apache.poi.xssf.eventusermodel; import junit.framework.TestCase; + import org.apache.poi.POIDataSamples; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.xssf.model.SharedStringsTable; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; +import org.xml.sax.SAXException; +import java.io.IOException; import java.util.List; import java.util.regex.Pattern; @@ -55,4 +59,24 @@ public final class TestReadOnlySharedStringsTable extends TestCase { } } + + public void testEmptySSTOnPackageObtainedViaWorkbook() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook(_ssTests.openResourceAsStream("noSharedStringTable.xlsx")); + OPCPackage pkg = wb.getPackage(); + assertEmptySST(pkg); + wb.close(); + } + + public void testEmptySSTOnPackageDirect() throws Exception { + OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("noSharedStringTable.xlsx")); + assertEmptySST(pkg); + } + + private void assertEmptySST(OPCPackage pkg) throws IOException, SAXException { + ReadOnlySharedStringsTable sst = new ReadOnlySharedStringsTable(pkg); + assertEquals(0, sst.getCount()); + assertEquals(0, sst.getUniqueCount()); + assertNull(sst.getItems()); // same state it's left in if fed a package which has no SST part. + } + } diff --git a/test-data/spreadsheet/noSharedStringTable.xlsx b/test-data/spreadsheet/noSharedStringTable.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..49f14658d0349191373d616c3dc55be785719f35 GIT binary patch literal 7820 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