From e1f1c5c01c5feb7a06aa03db35bbf9e5d6b6bdaa Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 27 Feb 2016 10:23:46 +0000 Subject: [PATCH] Bug 57914: Provide a better error message for OOXML strict format which we do not support yet. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1732619 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/TestAllFiles.java | 1 + .../opc/PackageRelationshipCollection.java | 4 +- .../poi/xssf/eventusermodel/XSSFReader.java | 12 +++ .../xssf/eventusermodel/TestXSSFReader.java | 97 +++++++++++------- test-data/spreadsheet/57914.xlsx | Bin 0 -> 9564 bytes 5 files changed, 77 insertions(+), 37 deletions(-) create mode 100644 test-data/spreadsheet/57914.xlsx diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java index 1d578fb7f7..e2d26391d7 100644 --- a/src/integrationtest/org/apache/poi/TestAllFiles.java +++ b/src/integrationtest/org/apache/poi/TestAllFiles.java @@ -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"); diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java index 4d01e1ca78..665c51f6c4 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java @@ -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; } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java index cc5fbb2cd4..2060a870a8 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java @@ -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); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java index c67447377c..3b5ac58ca7 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java @@ -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 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 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. on XLSX files generated by + * NPE from XSSFReader$SheetIterator. 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 index 0000000000000000000000000000000000000000..2477fa83886239575ec56700802c509d3595091f GIT binary patch literal 9564 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 UAXgUvz(xLokvnDw!_R;J2glL1)c^nh literal 0 HcmV?d00001 -- 2.39.5