Fix bug #50118
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1026412 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b99de96fa5
commit
d7eb8b6105
@ -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">
|
||||||
|
@ -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 ];
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
@ -227,6 +228,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
BIN
test-data/poifs/Notes.ole2
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user