Fix the block allocation test, but still leave the recent blocks hssf bug fixed

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@758353 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2009-03-25 17:22:06 +00:00
parent 579a4b95a4
commit 46590f58a1
2 changed files with 11 additions and 5 deletions

View File

@ -186,6 +186,7 @@ public class BlockAllocationTableReader
List blocks = new ArrayList(); List blocks = new ArrayList();
int currentBlock = startBlock; int currentBlock = startBlock;
boolean firstPass = true; boolean firstPass = true;
ListManagedBlock dataBlock = null;
// Process the chain from the start to the end // Process the chain from the start to the end
// Normally we have header, data, end // Normally we have header, data, end
@ -193,16 +194,21 @@ public class BlockAllocationTableReader
// For those cases, stop at the header, not the end // For those cases, stop at the header, not the end
while (currentBlock != POIFSConstants.END_OF_CHAIN) { while (currentBlock != POIFSConstants.END_OF_CHAIN) {
try { try {
blocks.add(blockList.remove(currentBlock)); // Grab the data at the current block offset
dataBlock = blockList.remove(currentBlock);
blocks.add(dataBlock);
// Now figure out which block we go to next
currentBlock = _entries.get(currentBlock); currentBlock = _entries.get(currentBlock);
firstPass = false;
} catch(IOException e) { } catch(IOException e) {
if(currentBlock == headerPropertiesStartBlock) { if(currentBlock == headerPropertiesStartBlock) {
// Special case where things are in the wrong order // Special case where things are in the wrong order
System.err.println("Warning, header block comes after data blocks in POIFS block listing"); System.err.println("Warning, header block comes after data blocks in POIFS block listing");
currentBlock = POIFSConstants.END_OF_CHAIN; currentBlock = POIFSConstants.END_OF_CHAIN;
} else if(currentBlock == 0) { } else if(currentBlock == 0 && firstPass) {
// Special case where the termination isn't done right // Special case where the termination isn't done right
System.err.println("Warning, incorrectly terminated data blocks in POIFS block listing (should end at -2, ended at 0)"); // on an empty set
System.err.println("Warning, incorrectly terminated empty data blocks in POIFS block listing (should end at -2, ended at 0)");
currentBlock = POIFSConstants.END_OF_CHAIN; currentBlock = POIFSConstants.END_OF_CHAIN;
} else { } else {
// Ripple up // Ripple up
@ -212,7 +218,7 @@ public class BlockAllocationTableReader
} }
return ( ListManagedBlock [] ) blocks return ( ListManagedBlock [] ) blocks
.toArray(new ListManagedBlock[ 0 ]); .toArray(new ListManagedBlock[ blocks.size() ]);
} }
// methods for debugging reader // methods for debugging reader

View File

@ -1329,7 +1329,7 @@ public class TestBlockAllocationTableReader
if (expected_length[ j ] == -1) if (expected_length[ j ] == -1)
{ {
fail("document " + j + " should have failed"); fail("document " + j + " should have failed, but found a length of " + dataBlocks.length);
} }
else else
{ {