]> source.dussan.org Git - poi.git/commitdiff
Fix the block allocation test, but still leave the recent blocks hssf bug fixed
authorNick Burch <nick@apache.org>
Wed, 25 Mar 2009 17:22:06 +0000 (17:22 +0000)
committerNick Burch <nick@apache.org>
Wed, 25 Mar 2009 17:22:06 +0000 (17:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@758353 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/storage/BlockAllocationTableReader.java
src/testcases/org/apache/poi/poifs/storage/TestBlockAllocationTableReader.java

index 19873c08fd59bc5a71839683a9b6ce151c6634d2..60ce199ee59a006bd4267a5246ee5048f58877cb 100644 (file)
@@ -186,6 +186,7 @@ public class BlockAllocationTableReader
         List blocks       = new ArrayList();
         int  currentBlock = startBlock;
         boolean firstPass = true;
+        ListManagedBlock dataBlock = null;
         
         // Process the chain from the start to the end
         // Normally we have header, data, end
@@ -193,16 +194,21 @@ public class BlockAllocationTableReader
         // For those cases, stop at the header, not the end
         while (currentBlock != POIFSConstants.END_OF_CHAIN) {
                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);
+                firstPass = false;
                } catch(IOException e) {
                        if(currentBlock == headerPropertiesStartBlock) {
                                // Special case where things are in the wrong order
                                System.err.println("Warning, header block comes after data blocks in POIFS block listing");
                                currentBlock = POIFSConstants.END_OF_CHAIN;
-                       } else if(currentBlock == 0) {
+                       } else if(currentBlock == 0 && firstPass) {
                                // 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;
                        } else {
                                // Ripple up
@@ -212,7 +218,7 @@ public class BlockAllocationTableReader
         }
         
         return ( ListManagedBlock [] ) blocks
-            .toArray(new ListManagedBlock[ 0 ]);
+            .toArray(new ListManagedBlock[ blocks.size() ]);
     }
 
     // methods for debugging reader
index d688ce14597380b06323d7f1f4df1e8a6228a572..b2042319ce3fba39e56c5581c11a631876f66222 100644 (file)
@@ -1329,7 +1329,7 @@ public class TestBlockAllocationTableReader
 
                 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
                 {