From 1f2ff5281c9db76b89f29cd2b91f129694523bc9 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 22 Oct 2010 17:23:39 +0000 Subject: [PATCH] Fix bug #50118 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1026412 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poifs/filesystem/POIFSDocumentPath.java | 16 ++++++-- .../filesystem/TestPOIFSDocumentPath.java | 22 ++++++++-- .../poifs/filesystem/TestPOIFSFileSystem.java | 38 ++++++++++++++++++ test-data/poifs/Notes.ole2 | Bin 0 -> 8192 bytes 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 test-data/poifs/Notes.ole2 diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index c27545d3cf..8ea8eb323b 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50118 - OLE2 does allow a directory with an empty name, so support this in POIFS 50119 - avoid NPE when XSSFReader comes across chart sheets diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java b/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java index 9617d6836a..dc1539a939 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java @@ -21,6 +21,9 @@ package org.apache.poi.poifs.filesystem; import java.io.File; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; + /** * Class POIFSDocumentPath * @@ -30,6 +33,8 @@ import java.io.File; public class POIFSDocumentPath { + private static final POILogger log = POILogFactory.getLogger(POIFSDocumentPath.class); + private String[] components; private int hashcode = 0; @@ -125,12 +130,17 @@ public class POIFSDocumentPath { for (int j = 0; j < components.length; j++) { - if ((components[ j ] == null) - || (components[ j ].length() == 0)) + if (components[ j ] == null) { throw new IllegalArgumentException( - "components cannot contain null or empty strings"); + "components cannot contain null"); + } + if (components[ j ].length() == 0) + { + log.log(POILogger.WARN, "Directory under " + path + " has an empty name, " + + "not all OLE2 readers will handle this file correctly!"); } + this.components[ j + path.components.length ] = components[ j ]; } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java index b09c469458..fef200fdcb 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java @@ -165,24 +165,40 @@ public final class TestPOIFSDocumentPath extends TestCase { } } - // test weird variants + // Test weird variants + + // This one is allowed, even if it's really odd assertEquals(n, new POIFSDocumentPath(base, null).length()); + new POIFSDocumentPath(base, new String[] + { + "fu", "" + }); + + // This one is allowed too + new POIFSDocumentPath(base, new String[] + { + "", "fu" + }); + + // This one shouldn't be allowed try { new POIFSDocumentPath(base, new String[] { - "fu", "" + "fu", null }); fail("should have caught IllegalArgumentException"); } catch (IllegalArgumentException ignored) { } + + // Ditto try { new POIFSDocumentPath(base, new String[] { - "fu", null + null, "fu" }); fail("should have caught IllegalArgumentException"); } diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java index 5ebc168941..ae9ac644a4 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Iterator; import junit.framework.TestCase; @@ -226,6 +227,43 @@ public final class TestPOIFSFileSystem extends TestCase { } } } + + /** + * Test that we can open files that come via Lotus notes. + * These have a top level directory without a name.... + */ + public void testNotesOLE2Files() throws Exception { + POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); + + // Open the file up + POIFSFileSystem fs = new POIFSFileSystem( + _samples.openResourceAsStream("Notes.ole2") + ); + + // Check the contents + assertEquals(1, fs.getRoot().getEntryCount()); + + Entry entry = fs.getRoot().getEntries().next(); + assertTrue(entry.isDirectoryEntry()); + assertTrue(entry instanceof DirectoryEntry); + + // The directory lacks a name! + DirectoryEntry dir = (DirectoryEntry)entry; + assertEquals("", dir.getName()); + + // Has two children + assertEquals(2, dir.getEntryCount()); + + // Check them + Iterator it = dir.getEntries(); + entry = it.next(); + assertEquals(true, entry.isDocumentEntry()); + assertEquals("\u0001Ole10Native", entry.getName()); + + entry = it.next(); + assertEquals(true, entry.isDocumentEntry()); + assertEquals("\u0001CompObj", entry.getName()); + } private static InputStream openSampleStream(String sampleFileName) { return HSSFTestDataSamples.openSampleFileStream(sampleFileName); diff --git a/test-data/poifs/Notes.ole2 b/test-data/poifs/Notes.ole2 new file mode 100644 index 0000000000000000000000000000000000000000..9aaed99d3d01f78ce8376deea1f7fdcaa82ac57c GIT binary patch literal 8192 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 bSG&{7)am8wj0$yTg*v0WJF8NC;nx2ET_Vws literal 0 HcmV?d00001 -- 2.39.5