git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1026412 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2010-10-22 17:23:39 +00:00
parent 09a71b9588
commit 1f2ff5281c
5 changed files with 71 additions and 6 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.8-beta1" date="2010-??-??"> <release version="3.8-beta1" date="2010-??-??">
<action dev="poi-developers" type="fix">50118 - OLE2 does allow a directory with an empty name, so support this in POIFS</action>
<action dev="poi-developers" type="fix">50119 - avoid NPE when XSSFReader comes across chart sheets</action> <action dev="poi-developers" type="fix">50119 - avoid NPE when XSSFReader comes across chart sheets</action>
</release> </release>
<release version="3.7" date="2010-10-25"> <release version="3.7" date="2010-10-25">

View File

@ -21,6 +21,9 @@ package org.apache.poi.poifs.filesystem;
import java.io.File; import java.io.File;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
/** /**
* Class POIFSDocumentPath * Class POIFSDocumentPath
* *
@ -30,6 +33,8 @@ import java.io.File;
public class POIFSDocumentPath public class POIFSDocumentPath
{ {
private static final POILogger log = POILogFactory.getLogger(POIFSDocumentPath.class);
private String[] components; private String[] components;
private int hashcode = 0; private int hashcode = 0;
@ -125,12 +130,17 @@ public class POIFSDocumentPath
{ {
for (int j = 0; j < components.length; j++) for (int j = 0; j < components.length; j++)
{ {
if ((components[ j ] == null) if (components[ j ] == null)
|| (components[ j ].length() == 0))
{ {
throw new IllegalArgumentException( 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 ] = this.components[ j + path.components.length ] =
components[ j ]; components[ j ];
} }

View File

@ -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()); 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 try
{ {
new POIFSDocumentPath(base, new String[] new POIFSDocumentPath(base, new String[]
{ {
"fu", "" "fu", null
}); });
fail("should have caught IllegalArgumentException"); fail("should have caught IllegalArgumentException");
} }
catch (IllegalArgumentException ignored) catch (IllegalArgumentException ignored)
{ {
} }
// Ditto
try try
{ {
new POIFSDocumentPath(base, new String[] new POIFSDocumentPath(base, new String[]
{ {
"fu", null null, "fu"
}); });
fail("should have caught IllegalArgumentException"); fail("should have caught IllegalArgumentException");
} }

View File

@ -22,6 +22,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Iterator;
import junit.framework.TestCase; 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<Entry> 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) { private static InputStream openSampleStream(String sampleFileName) {
return HSSFTestDataSamples.openSampleFileStream(sampleFileName); return HSSFTestDataSamples.openSampleFileStream(sampleFileName);

BIN
test-data/poifs/Notes.ole2 Normal file

Binary file not shown.