to correctly match up chunks git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@911878 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_7_BETA1
@@ -34,6 +34,7 @@ | |||
<changes> | |||
<release version="3.7-SNAPSHOT" date="2010-??-??"> | |||
<action dev="POI-DEVELOPERS" type="fix">Make poifs.filesystem.DirectoryNode preserve the original ordering of its files, which HSMF needs to be able to correctly match up chunks</action> | |||
<action dev="POI-DEVELOPERS" type="add">Support evaluation of indirect defined names in INDIRECT</action> | |||
<action dev="POI-DEVELOPERS" type="fix">43670 - Improve HDGF ChunkV11 separator detection, and short string detection, to solve the "Negative length of ChunkHeader" problem</action> | |||
<action dev="POI-DEVELOPERS" type="add">48617 - Optionally allow the overriding of the Locale used by DataFormatter to control how the default number and date formats should look</action> |
@@ -41,7 +41,9 @@ public class DirectoryNode | |||
{ | |||
// Map of Entry instances, keyed by their names | |||
private Map<String,Entry> _entries; | |||
private Map<String,Entry> _byname; | |||
// Our list of entries, kept sorted to preserve order | |||
private ArrayList<Entry> _entries; | |||
// the POIFSFileSystem we belong to | |||
private POIFSFileSystem _filesystem; | |||
@@ -75,7 +77,8 @@ public class DirectoryNode | |||
}); | |||
} | |||
_filesystem = filesystem; | |||
_entries = new HashMap<String, Entry>(); | |||
_byname = new HashMap<String, Entry>(); | |||
_entries = new ArrayList<Entry>(); | |||
Iterator<Property> iter = property.getChildren(); | |||
while (iter.hasNext()) | |||
@@ -93,7 +96,8 @@ public class DirectoryNode | |||
childNode = new DocumentNode(( DocumentProperty ) child, | |||
this); | |||
} | |||
_entries.put(childNode.getName(), childNode); | |||
_entries.add(childNode); | |||
_byname.put(childNode.getName(), childNode); | |||
} | |||
} | |||
@@ -149,7 +153,8 @@ public class DirectoryNode | |||
(( DirectoryProperty ) getProperty()).addChild(property); | |||
_filesystem.addDocument(document); | |||
_entries.put(property.getName(), rval); | |||
_entries.add(rval); | |||
_byname.put(property.getName(), rval); | |||
return rval; | |||
} | |||
@@ -165,7 +170,7 @@ public class DirectoryNode | |||
boolean changeName(final String oldName, final String newName) | |||
{ | |||
boolean rval = false; | |||
EntryNode child = ( EntryNode ) _entries.get(oldName); | |||
EntryNode child = ( EntryNode ) _byname.get(oldName); | |||
if (child != null) | |||
{ | |||
@@ -173,8 +178,8 @@ public class DirectoryNode | |||
.changeName(child.getProperty(), newName); | |||
if (rval) | |||
{ | |||
_entries.remove(oldName); | |||
_entries.put(child.getProperty().getName(), child); | |||
_byname.remove(oldName); | |||
_byname.put(child.getProperty().getName(), child); | |||
} | |||
} | |||
return rval; | |||
@@ -196,7 +201,8 @@ public class DirectoryNode | |||
if (rval) | |||
{ | |||
_entries.remove(entry.getName()); | |||
_entries.remove(entry); | |||
_byname.remove(entry.getName()); | |||
_filesystem.remove(entry); | |||
} | |||
return rval; | |||
@@ -217,7 +223,7 @@ public class DirectoryNode | |||
public Iterator<Entry> getEntries() | |||
{ | |||
return _entries.values().iterator(); | |||
return _entries.iterator(); | |||
} | |||
/** | |||
@@ -263,7 +269,7 @@ public class DirectoryNode | |||
if (name != null) | |||
{ | |||
rval = _entries.get(name); | |||
rval = _byname.get(name); | |||
} | |||
if (rval == null) | |||
{ | |||
@@ -332,7 +338,8 @@ public class DirectoryNode | |||
(( DirectoryProperty ) getProperty()).addChild(property); | |||
_filesystem.addDirectory(property); | |||
_entries.put(name, rval); | |||
_entries.add(rval); | |||
_byname.put(name, rval); | |||
return rval; | |||
} | |||
@@ -416,10 +423,7 @@ public class DirectoryNode | |||
List components = new ArrayList(); | |||
components.add(getProperty()); | |||
SortedMap<String,Entry> sortedEntries = | |||
new TreeMap<String,Entry>(_entries); | |||
Iterator<Entry> iter = sortedEntries.values().iterator(); | |||
Iterator<Entry> iter = _entries.iterator(); | |||
while (iter.hasNext()) | |||
{ | |||
components.add(iter.next()); |
@@ -105,7 +105,6 @@ public class AttachmentChunks implements ChunkGroup { | |||
* Orders by the attachment number. | |||
*/ | |||
public static class AttachmentChunksSorter implements Comparator<AttachmentChunks> { | |||
@Override | |||
public int compare(AttachmentChunks a, AttachmentChunks b) { | |||
return a.poifsName.compareTo(b.poifsName); | |||
} |
@@ -197,7 +197,6 @@ public final class RecipientChunks implements ChunkGroup { | |||
* Orders by the recipient number. | |||
*/ | |||
public static class RecipientChunksSorter implements Comparator<RecipientChunks> { | |||
@Override | |||
public int compare(RecipientChunks a, RecipientChunks b) { | |||
if(a.recipientNumber < b.recipientNumber) | |||
return -1; |
@@ -151,10 +151,10 @@ public final class TestPOIFSChunkParser extends TestCase { | |||
assertEquals(9, groups.length); | |||
assertTrue(groups[0] instanceof Chunks); | |||
assertTrue(groups[1] instanceof RecipientChunks); | |||
assertTrue(groups[2] instanceof AttachmentChunks); | |||
assertTrue(groups[2] instanceof RecipientChunks); | |||
assertTrue(groups[3] instanceof RecipientChunks); | |||
assertTrue(groups[4] instanceof RecipientChunks); | |||
assertTrue(groups[5] instanceof RecipientChunks); | |||
assertTrue(groups[5] instanceof AttachmentChunks); | |||
assertTrue(groups[6] instanceof RecipientChunks); | |||
assertTrue(groups[7] instanceof RecipientChunks); | |||
assertTrue(groups[8] instanceof NameIdChunks); | |||
@@ -162,33 +162,33 @@ public final class TestPOIFSChunkParser extends TestCase { | |||
// In FS order initially | |||
RecipientChunks[] chunks = new RecipientChunks[] { | |||
(RecipientChunks)groups[1], | |||
(RecipientChunks)groups[2], | |||
(RecipientChunks)groups[3], | |||
(RecipientChunks)groups[4], | |||
(RecipientChunks)groups[5], | |||
(RecipientChunks)groups[6], | |||
(RecipientChunks)groups[7], | |||
}; | |||
assertEquals(6, chunks.length); | |||
assertEquals(0, chunks[0].recipientNumber); | |||
assertEquals(4, chunks[1].recipientNumber); | |||
assertEquals(3, chunks[2].recipientNumber); | |||
assertEquals(2, chunks[3].recipientNumber); | |||
assertEquals(1, chunks[4].recipientNumber); | |||
assertEquals(5, chunks[5].recipientNumber); | |||
assertEquals(2, chunks[1].recipientNumber); | |||
assertEquals(4, chunks[2].recipientNumber); | |||
assertEquals(5, chunks[3].recipientNumber); | |||
assertEquals(3, chunks[4].recipientNumber); | |||
assertEquals(1, chunks[5].recipientNumber); | |||
// Check | |||
assertEquals("'Ashutosh Dandavate'", chunks[0].getRecipientName()); | |||
assertEquals("ashutosh.dandavate@alfresco.com", chunks[0].getRecipientEmailAddress()); | |||
assertEquals("nick.burch@alfresco.com", chunks[1].getRecipientName()); | |||
assertEquals("nick.burch@alfresco.com", chunks[1].getRecipientEmailAddress()); | |||
assertEquals("nickb@alfresco.com", chunks[2].getRecipientName()); | |||
assertEquals("nickb@alfresco.com", chunks[2].getRecipientEmailAddress()); | |||
assertEquals("'Mike Farman'", chunks[3].getRecipientName()); | |||
assertEquals("mikef@alfresco.com", chunks[3].getRecipientEmailAddress()); | |||
assertEquals("'Paul Holmes-Higgin'", chunks[4].getRecipientName()); | |||
assertEquals("paul.hh@alfresco.com", chunks[4].getRecipientEmailAddress()); | |||
assertEquals("'Roy Wetherall'", chunks[5].getRecipientName()); | |||
assertEquals("roy.wetherall@alfresco.com", chunks[5].getRecipientEmailAddress()); | |||
assertEquals("'Mike Farman'", chunks[1].getRecipientName()); | |||
assertEquals("mikef@alfresco.com", chunks[1].getRecipientEmailAddress()); | |||
assertEquals("nick.burch@alfresco.com", chunks[2].getRecipientName()); | |||
assertEquals("nick.burch@alfresco.com", chunks[2].getRecipientEmailAddress()); | |||
assertEquals("'Roy Wetherall'", chunks[3].getRecipientName()); | |||
assertEquals("roy.wetherall@alfresco.com", chunks[3].getRecipientEmailAddress()); | |||
assertEquals("nickb@alfresco.com", chunks[4].getRecipientName()); | |||
assertEquals("nickb@alfresco.com", chunks[4].getRecipientEmailAddress()); | |||
assertEquals("'Paul Holmes-Higgin'", chunks[5].getRecipientName()); | |||
assertEquals("paul.hh@alfresco.com", chunks[5].getRecipientEmailAddress()); | |||
// Now sort, and re-check | |||
Arrays.sort(chunks, new RecipientChunksSorter()); |
@@ -158,26 +158,36 @@ public final class TestDirectoryNode extends TestCase { | |||
DirectoryEntry root = fs.getRoot(); | |||
// verify cannot delete the root directory | |||
assertTrue(!root.delete()); | |||
assertFalse(root.delete()); | |||
assertTrue(root.isEmpty()); | |||
DirectoryEntry dir = fs.createDirectory("myDir"); | |||
assertTrue(!root.isEmpty()); | |||
assertFalse(root.isEmpty()); | |||
assertTrue(dir.isEmpty()); | |||
// verify can delete empty directory | |||
assertFalse(root.delete()); | |||
assertTrue(dir.delete()); | |||
// Now look at a non-empty one | |||
dir = fs.createDirectory("NextDir"); | |||
DocumentEntry doc = | |||
dir.createDocument("foo", | |||
new ByteArrayInputStream(new byte[ 1 ])); | |||
assertTrue(!dir.isEmpty()); | |||
assertFalse(root.isEmpty()); | |||
assertFalse(dir.isEmpty()); | |||
// verify cannot delete empty directory | |||
assertTrue(!dir.delete()); | |||
// verify cannot delete non-empty directory | |||
assertFalse(dir.delete()); | |||
// but we can delete it if we remove the document | |||
assertTrue(doc.delete()); | |||
// verify now we can delete it | |||
assertTrue(dir.isEmpty()); | |||
assertTrue(dir.delete()); | |||
// It's really gone! | |||
assertTrue(root.isEmpty()); | |||
} | |||