]> source.dussan.org Git - poi.git/commitdiff
Bug 57914: Provide a better error message for OOXML strict format which we do not...
authorDominik Stadler <centic@apache.org>
Sat, 27 Feb 2016 10:23:46 +0000 (10:23 +0000)
committerDominik Stadler <centic@apache.org>
Sat, 27 Feb 2016 10:23:46 +0000 (10:23 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1732619 13f79535-47bb-0310-9956-ffa450edef68

src/integrationtest/org/apache/poi/TestAllFiles.java
src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
test-data/spreadsheet/57914.xlsx [new file with mode: 0644]

index 1d578fb7f76a341165785508fa87e0968d121bfd..e2d26391d70c84e8be7861a42941999c565ee2e7 100644 (file)
@@ -254,6 +254,7 @@ public class TestAllFiles {
         EXPECTED_FAILURES.add("spreadsheet/SampleSS.strict.xlsx");
         EXPECTED_FAILURES.add("spreadsheet/SimpleStrict.xlsx");
         EXPECTED_FAILURES.add("spreadsheet/sample.strict.xlsx");
+        EXPECTED_FAILURES.add("spreadsheet/57914.xlsx");
 
         // non-TNEF files
         EXPECTED_FAILURES.add("ddf/Container.dat");
index 4d01e1ca782354ef7e0b5ab154bb051a8156ba2b..665c51f6c419cceb02207d501e0209e1b97a57bf 100644 (file)
@@ -273,13 +273,13 @@ public final class PackageRelationshipCollection implements
         if (index < 0 || index > relationshipsByID.values().size())
             throw new IllegalArgumentException("index");
 
-        PackageRelationship retRel = null;
         int i = 0;
         for (PackageRelationship rel : relationshipsByID.values()) {
             if (index == i++)
                 return rel;
         }
-        return retRel;
+
+        return null;
     }
 
     /**
index cc5fbb2cd4bcba46e5bcb609e19afcb4ca76c6f8..2060a870a8c9746b80f114c36726703c62e98337 100644 (file)
@@ -69,6 +69,18 @@ public class XSSFReader {
         PackageRelationship coreDocRelationship = this.pkg.getRelationshipsByType(
                 PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0);
 
+        // strict OOXML likely not fully supported, see #57699
+        // this code is similar to POIXMLDocumentPart.getPartFromOPCPackage(), but I could not combine it
+        // easily due to different return values
+        if(coreDocRelationship == null) {
+            if (this.pkg.getRelationshipsByType(
+                    PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0) != null) {
+                throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
+            }
+
+            throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
+        }
+
         // Get the part that holds the workbook
         workbookPart = this.pkg.getPart(coreDocRelationship);
     }
index c67447377cf129b475b9e6fc0fd18b7b30b70c3c..3b5ac58ca7cffcc1142eb3a42d361eb313b8b657 100644 (file)
@@ -21,8 +21,8 @@ import java.io.InputStream;
 import java.util.Iterator;
 import java.util.List;
 
-import junit.framework.TestCase;
-
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.POIXMLException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.xssf.XSSFTestDataSamples;
@@ -31,7 +31,8 @@ import org.apache.poi.xssf.model.StylesTable;
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
 import org.apache.poi.xssf.usermodel.XSSFShape;
 import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
-import org.apache.poi.POIDataSamples;
+
+import junit.framework.TestCase;
 
 /**
  * Tests for {@link XSSFReader}
@@ -168,38 +169,64 @@ public final class TestXSSFReader extends TestCase {
           stream.close();
       }
    }
-   /**
-    * Test text extraction from text box using getShapes()
-    * @throws Exception
-    */
-   public void testShapes() throws Exception{
-       OPCPackage pkg =  XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx");
-       XSSFReader r = new XSSFReader(pkg);
-       XSSFReader.SheetIterator it = (XSSFReader.SheetIterator)r.getSheetsData();
-       
-       StringBuilder sb = new StringBuilder();
-       while(it.hasNext())
-       {    
-          it.next();
-          List<XSSFShape> shapes = it.getShapes();
-          if (shapes != null){
-              for (XSSFShape shape : shapes){
-                  if (shape instanceof XSSFSimpleShape){
-                      String t = ((XSSFSimpleShape)shape).getText();
-                      sb.append(t).append('\n');
-                  }
-              }
-          }
-       }
-       String text = sb.toString();
-       assertTrue(text.indexOf("Line 1") > -1);
-       assertTrue(text.indexOf("Line 2") > -1);
-       assertTrue(text.indexOf("Line 3") > -1);
 
-   }
-   
+    /**
+     * Test text extraction from text box using getShapes()
+     *
+     * @throws Exception
+     */
+    public void testShapes() throws Exception {
+        OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx");
+        XSSFReader r = new XSSFReader(pkg);
+        XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
+
+        String text = getShapesString(it);
+        assertTrue(text.contains("Line 1"));
+        assertTrue(text.contains("Line 2"));
+        assertTrue(text.contains("Line 3"));
+    }
+
+    private String getShapesString(XSSFReader.SheetIterator it) {
+        StringBuilder sb = new StringBuilder();
+        while (it.hasNext()) {
+            it.next();
+            List<XSSFShape> shapes = it.getShapes();
+            if (shapes != null) {
+                for (XSSFShape shape : shapes) {
+                    if (shape instanceof XSSFSimpleShape) {
+                        String t = ((XSSFSimpleShape) shape).getText();
+                        sb.append(t).append('\n');
+                    }
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    public void testBug57914() throws Exception {
+        OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("57914.xlsx");
+        final XSSFReader r;
+
+        // for now expect this to fail, when we fix 57699, this one should fail so we know we should adjust
+        // this test as well
+        try {
+            r = new XSSFReader(pkg);
+            fail("This will fail until bug 57699 is fixed");
+        } catch (POIXMLException e) {
+            assertTrue("Had " + e, e.getMessage().contains("57699"));
+            return;
+        }
+
+        XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
+
+        String text = getShapesString(it);
+        assertTrue(text.contains("Line 1"));
+        assertTrue(text.contains("Line 2"));
+        assertTrue(text.contains("Line 3"));
+    }
+
    /**
-    * NPE from XSSFReader$SheetIterator.<init> on XLSX files generated by 
+    * NPE from XSSFReader$SheetIterator.<init> on XLSX files generated by
     *  the openpyxl library
     */
    public void test58747() throws Exception {
@@ -209,11 +236,11 @@ public final class TestXSSFReader extends TestCase {
        XSSFReader reader = new XSSFReader(pkg);
        StylesTable styles = reader.getStylesTable();
        assertNotNull(styles);
-       
+
        XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
        assertEquals(true, iter.hasNext());
        iter.next();
-       
+
        assertEquals(false, iter.hasNext());
        assertEquals("Orders", iter.getSheetName());
    }
diff --git a/test-data/spreadsheet/57914.xlsx b/test-data/spreadsheet/57914.xlsx
new file mode 100644 (file)
index 0000000..2477fa8
Binary files /dev/null and b/test-data/spreadsheet/57914.xlsx differ