]> source.dussan.org Git - poi.git/commitdiff
Bugzilla 52835 - Tolerate missing Count and UniqueCount attributes when parsing share...
authorYegor Kozlov <yegor@apache.org>
Sun, 11 Mar 2012 07:19:07 +0000 (07:19 +0000)
committerYegor Kozlov <yegor@apache.org>
Sun, 11 Mar 2012 07:19:07 +0000 (07:19 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1299338 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java [new file with mode: 0644]

index df242e64440121b8e234e30dfe463e673e080444..8d0cb5dc946784ee924e6960d7752c083e36a8f4 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta6" date="2012-??-??">
+           <action dev="poi-developers" type="fix">52835 - Tolerate missing Count and UniqueCount attributes when parsing shared strings table in XSSF eventusermodel</action>
            <action dev="poi-developers" type="add">52818 - Added implementation for RANK()</action>
            <action dev="poi-developers" type="fix">52682 - allow setting text with trailing carriage return in HSLF</action>
            <action dev="poi-developers" type="fix">52244 - use correct text attributes when presentation has multiple TxMasterStyleAtoms of the same type</action>
index 52e2c258ae14c52ffd30ddd33d7ea1e5a11d9782..8a4b139ff925065b9303eb8738c2e4db5b28a652 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.eventusermodel;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
@@ -28,6 +29,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.xssf.usermodel.XSSFRelation;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -91,7 +93,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
     /**
      * The shared strings table.
      */
-    private String[] strings;
+    private List<String> strings;
 
     /**
      * @param pkg
@@ -173,24 +175,28 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
      * @return the item at the specified position in this Shared String table.
      */
     public String getEntryAt(int idx) {
-        return strings[idx];
+        return strings.get(idx);
+    }
+
+    public List<String> getItems() {
+        return strings;
     }
 
     //// ContentHandler methods ////
 
     private StringBuffer characters;
     private boolean tIsOpen;
-    private int index;
 
     public void startElement(String uri, String localName, String name,
                              Attributes attributes) throws SAXException {
         if ("sst".equals(name)) {
             String count = attributes.getValue("count");
+            if(count != null) this.count = Integer.parseInt(count);
             String uniqueCount = attributes.getValue("uniqueCount");
-            this.count = Integer.parseInt(count);
-            this.uniqueCount = Integer.parseInt(uniqueCount);
-            this.strings = new String[this.uniqueCount];
-            index = 0;
+            if(uniqueCount != null) this.uniqueCount = Integer.parseInt(uniqueCount);
+
+            this.strings = new ArrayList<String>(this.uniqueCount);
+
             characters = new StringBuffer();
         } else if ("si".equals(name)) {
             characters.setLength(0);
@@ -202,8 +208,7 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {
     public void endElement(String uri, String localName, String name)
             throws SAXException {
         if ("si".equals(name)) {
-            strings[index] = characters.toString();              
-            ++index;
+            strings.add(characters.toString());
         } else if ("t".equals(name)) {
            tIsOpen = false;
         }
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestReadOnlySharedStringsTable.java
new file mode 100644 (file)
index 0000000..c469036
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+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.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Tests for {@link org.apache.poi.xssf.eventusermodel.XSSFReader}
+ */
+public final class TestReadOnlySharedStringsTable extends TestCase {
+    private static POIDataSamples _ssTests = POIDataSamples.getSpreadSheetInstance();
+
+    public void testParse() throws Exception {
+               OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
+        List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml"));
+        assertEquals(1, parts.size());
+
+        SharedStringsTable stbl = new SharedStringsTable(parts.get(0), null);
+        ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0), null);
+
+        assertEquals(stbl.getCount(), rtbl.getCount());
+        assertEquals(stbl.getUniqueCount(), rtbl.getUniqueCount());
+
+        assertEquals(stbl.getItems().size(), stbl.getUniqueCount());
+        assertEquals(rtbl.getItems().size(), rtbl.getUniqueCount());
+        for(int i=0; i < stbl.getUniqueCount(); i++){
+            CTRst i1 = stbl.getEntryAt(i);
+            String i2 = rtbl.getEntryAt(i);
+            assertEquals(i1.getT(), i2);
+        }
+
+       }
+}