git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1026412 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_8_BETA1
@@ -34,6 +34,7 @@ | |||
<changes> | |||
<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> | |||
</release> | |||
<release version="3.7" date="2010-10-25"> |
@@ -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 ]; | |||
} |
@@ -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"); | |||
} |
@@ -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<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) { | |||
return HSSFTestDataSamples.openSampleFileStream(sampleFileName); |