]> source.dussan.org Git - poi.git/commitdiff
Improve ReadOnlySharedStringsTable to cope gracefully with an empty SST part.
authorDavid North <dnorth@apache.org>
Wed, 19 Aug 2015 11:10:13 +0000 (11:10 +0000)
committerDavid North <dnorth@apache.org>
Wed, 19 Aug 2015 11:10:13 +0000 (11:10 +0000)
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

src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java
test-data/spreadsheet/noSharedStringTable.xlsx [new file with mode: 0755]

index 5263473bcacf6c03a83d647c438a248d3e1a5cec..24e2c649d3f4c12125dc7f7aec8650c8cf3b38f8 100644 (file)
@@ -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());
+            }
         }
     }
 
index c4690369b90fd016c693d6de5d23f473e6f3639a..ad8470babafa5f00f2841e12dde8733b4323a478 100644 (file)
 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 (executable)
index 0000000..49f1465
Binary files /dev/null and b/test-data/spreadsheet/noSharedStringTable.xlsx differ