git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1026412 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_8_BETA1
<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"> |
import java.io.File; | import java.io.File; | ||||
import org.apache.poi.util.POILogFactory; | |||||
import org.apache.poi.util.POILogger; | |||||
/** | /** | ||||
* Class POIFSDocumentPath | * Class POIFSDocumentPath | ||||
* | * | ||||
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; | ||||
{ | { | ||||
for (int j = 0; j < components.length; j++) | for (int j = 0; j < components.length; j++) | ||||
{ | { | ||||
if ((components[ j ] == null) | |||||
|| (components[ j ].length() == 0)) | |||||
if (components[ j ] == null) | |||||
{ | { | ||||
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 ]; | ||||
} | } |
} | } | ||||
} | } | ||||
// 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"); | ||||
} | } |
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; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/** | |||||
* 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); |