Correct mini stream initialisation, and enable more npoifs write tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590088 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2014-04-25 18:14:28 +00:00
parent 4b6ae05a04
commit e4e0e93ff5
2 changed files with 94 additions and 119 deletions

View File

@ -86,9 +86,13 @@ public class NPOIFSMiniStore extends BlockStore
* Load the block, extending the underlying stream if needed * Load the block, extending the underlying stream if needed
*/ */
protected ByteBuffer createBlockIfNeeded(final int offset) throws IOException { protected ByteBuffer createBlockIfNeeded(final int offset) throws IOException {
// Ensure we have our first block at this point // If we are the first block to be allocated, initialise the stream
if (_mini_stream.getStartBlock() == POIFSConstants.END_OF_CHAIN) { if (_mini_stream.getStartBlock() == POIFSConstants.END_OF_CHAIN) {
getFreeBlock(); int firstBigBlock = _filesystem.getFreeBlock();
_filesystem.createBlockIfNeeded(firstBigBlock);
_filesystem.setNextBlock(firstBigBlock, POIFSConstants.END_OF_CHAIN);
_filesystem._get_property_table().getRoot().setStartBlock(firstBigBlock);
_mini_stream = new NPOIFSStream(_filesystem, firstBigBlock);
} }
// Try to get it without extending the stream // Try to get it without extending the stream
@ -189,10 +193,9 @@ public class NPOIFSMiniStore extends BlockStore
// Are we the first SBAT? // Are we the first SBAT?
if(_header.getSBATCount() == 0) { if(_header.getSBATCount() == 0) {
// Tell the header that we've got our first SBAT there
_header.setSBATStart(batForSBAT); _header.setSBATStart(batForSBAT);
_header.setSBATBlockCount(1); _header.setSBATBlockCount(1);
_filesystem._get_property_table().getRoot().setStartBlock(batForSBAT);
_mini_stream = new NPOIFSStream(_filesystem, batForSBAT);
} else { } else {
// Find the end of the SBAT stream, and add the sbat in there // Find the end of the SBAT stream, and add the sbat in there
ChainLoopDetector loopDetector = _filesystem.getChainLoopDetector(); ChainLoopDetector loopDetector = _filesystem.getChainLoopDetector();

View File

@ -701,20 +701,16 @@ public final class TestNPOIFSFileSystem {
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) { assertEquals(4, fs.getNextBlock(3));
assertEquals(4, fs.getNextBlock(3)); assertEquals(5, fs.getNextBlock(4));
assertEquals(5, fs.getNextBlock(4)); assertEquals(6, fs.getNextBlock(5));
assertEquals(6, fs.getNextBlock(5)); assertEquals(7, fs.getNextBlock(6));
assertEquals(7, fs.getNextBlock(6)); assertEquals(8, fs.getNextBlock(7));
assertEquals(8, fs.getNextBlock(7)); assertEquals(9, fs.getNextBlock(8));
assertEquals(9, fs.getNextBlock(8)); assertEquals(10, fs.getNextBlock(9));
assertEquals(10, fs.getNextBlock(9)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10)); assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(11));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(11));
} else {
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(4));
}
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock()); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock());
@ -727,79 +723,66 @@ public final class TestNPOIFSFileSystem {
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) { assertEquals(4, fs.getNextBlock(3));
assertEquals(4, fs.getNextBlock(3)); assertEquals(5, fs.getNextBlock(4));
assertEquals(5, fs.getNextBlock(4)); assertEquals(6, fs.getNextBlock(5));
assertEquals(6, fs.getNextBlock(5)); assertEquals(7, fs.getNextBlock(6));
assertEquals(7, fs.getNextBlock(6)); assertEquals(8, fs.getNextBlock(7));
assertEquals(8, fs.getNextBlock(7)); assertEquals(9, fs.getNextBlock(8));
assertEquals(9, fs.getNextBlock(8)); assertEquals(10, fs.getNextBlock(9));
assertEquals(10, fs.getNextBlock(9)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(12, fs.getNextBlock(11));
assertEquals(13, fs.getNextBlock(12));
assertEquals(14, fs.getNextBlock(13));
assertEquals(15, fs.getNextBlock(14));
assertEquals(16, fs.getNextBlock(15));
assertEquals(17, fs.getNextBlock(16));
assertEquals(18, fs.getNextBlock(17));
assertEquals(19, fs.getNextBlock(18));
assertEquals(20, fs.getNextBlock(19));
assertEquals(21, fs.getNextBlock(20));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(22));
assertEquals(12, fs.getNextBlock(11));
assertEquals(13, fs.getNextBlock(12));
assertEquals(14, fs.getNextBlock(13));
assertEquals(15, fs.getNextBlock(14));
assertEquals(16, fs.getNextBlock(15));
assertEquals(17, fs.getNextBlock(16));
assertEquals(18, fs.getNextBlock(17));
assertEquals(19, fs.getNextBlock(18));
assertEquals(20, fs.getNextBlock(19));
assertEquals(21, fs.getNextBlock(20));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(22));
} else {
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3));
assertEquals(5, fs.getNextBlock(4));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(5));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(6));
}
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock()); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock());
// Now Add a mini stream // Now Add a mini stream
byte[] mini = new byte[] { 0, 1, 2, 3, 4 }; byte[] mini = new byte[] { 42, 0, 1, 2, 3, 4, 42 };
testDir.createDocument("Mini", new ByteArrayInputStream(mini)); testDir.createDocument("Mini", new ByteArrayInputStream(mini));
// Mini stream will get one block for fat + one block for data // Mini stream will get one block for fat + one block for data
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) { assertEquals(4, fs.getNextBlock(3));
assertEquals(4, fs.getNextBlock(3)); assertEquals(5, fs.getNextBlock(4));
assertEquals(5, fs.getNextBlock(4)); assertEquals(6, fs.getNextBlock(5));
assertEquals(6, fs.getNextBlock(5)); assertEquals(7, fs.getNextBlock(6));
assertEquals(7, fs.getNextBlock(6)); assertEquals(8, fs.getNextBlock(7));
assertEquals(8, fs.getNextBlock(7)); assertEquals(9, fs.getNextBlock(8));
assertEquals(9, fs.getNextBlock(8)); assertEquals(10, fs.getNextBlock(9));
assertEquals(10, fs.getNextBlock(9)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(12, fs.getNextBlock(11));
assertEquals(13, fs.getNextBlock(12));
assertEquals(14, fs.getNextBlock(13));
assertEquals(15, fs.getNextBlock(14));
assertEquals(16, fs.getNextBlock(15));
assertEquals(17, fs.getNextBlock(16));
assertEquals(18, fs.getNextBlock(17));
assertEquals(19, fs.getNextBlock(18));
assertEquals(20, fs.getNextBlock(19));
assertEquals(21, fs.getNextBlock(20));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(22));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(23));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(24));
assertEquals(12, fs.getNextBlock(11));
assertEquals(13, fs.getNextBlock(12));
assertEquals(14, fs.getNextBlock(13));
assertEquals(15, fs.getNextBlock(14));
assertEquals(16, fs.getNextBlock(15));
assertEquals(17, fs.getNextBlock(16));
assertEquals(18, fs.getNextBlock(17));
assertEquals(19, fs.getNextBlock(18));
assertEquals(20, fs.getNextBlock(19));
assertEquals(21, fs.getNextBlock(20));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21));
assertEquals(23, fs.getNextBlock(22));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(23));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(24));
} else {
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3));
assertEquals(5, fs.getNextBlock(4));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(5));
assertEquals(7, fs.getNextBlock(6));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(7));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(8));
}
// Check the mini stream location was set // Check the mini stream location was set
assertEquals(22, fs.getRoot().getProperty().getStartBlock()); // (22 is mini fat, 23 is first mini stream block)
assertEquals(23, fs.getRoot().getProperty().getStartBlock());
// Write and read back // Write and read back
@ -808,42 +791,34 @@ public final class TestNPOIFSFileSystem {
// Check it's all unchanged // Check it's all unchanged
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
if (1==0) { if(1==0) { // TODO FIX
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) { assertEquals(4, fs.getNextBlock(3));
assertEquals(4, fs.getNextBlock(3)); assertEquals(5, fs.getNextBlock(4));
assertEquals(5, fs.getNextBlock(4)); assertEquals(6, fs.getNextBlock(5));
assertEquals(6, fs.getNextBlock(5)); assertEquals(7, fs.getNextBlock(6));
assertEquals(7, fs.getNextBlock(6)); assertEquals(8, fs.getNextBlock(7));
assertEquals(8, fs.getNextBlock(7)); assertEquals(9, fs.getNextBlock(8));
assertEquals(9, fs.getNextBlock(8)); assertEquals(10, fs.getNextBlock(9));
assertEquals(10, fs.getNextBlock(9)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
assertEquals(12, fs.getNextBlock(11)); assertEquals(12, fs.getNextBlock(11));
assertEquals(13, fs.getNextBlock(12)); assertEquals(13, fs.getNextBlock(12));
assertEquals(14, fs.getNextBlock(13)); assertEquals(14, fs.getNextBlock(13));
assertEquals(15, fs.getNextBlock(14)); assertEquals(15, fs.getNextBlock(14));
assertEquals(16, fs.getNextBlock(15)); assertEquals(16, fs.getNextBlock(15));
assertEquals(17, fs.getNextBlock(16)); assertEquals(17, fs.getNextBlock(16));
assertEquals(18, fs.getNextBlock(17)); assertEquals(18, fs.getNextBlock(17));
assertEquals(19, fs.getNextBlock(18)); assertEquals(19, fs.getNextBlock(18));
assertEquals(20, fs.getNextBlock(19)); assertEquals(20, fs.getNextBlock(19));
assertEquals(21, fs.getNextBlock(20)); assertEquals(21, fs.getNextBlock(20));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(21));
assertEquals(23, fs.getNextBlock(22)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(22));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(23)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(23));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(24)); assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(24));
} else {
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3));
assertEquals(5, fs.getNextBlock(4));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(5));
assertEquals(7, fs.getNextBlock(6));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(7));
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(8));
}
} }
assertEquals(22, fs.getRoot().getProperty().getStartBlock());
assertEquals(23, fs.getRoot().getProperty().getStartBlock());
// Check some data // Check some data
@ -899,10 +874,10 @@ if (1==0) {
// Check the mini stream was added, then the main stream // Check the mini stream was added, then the main stream
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
assertEquals(3, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2)); // Mini Fat
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3)); // Mini Stream
assertEquals(5, fs.getNextBlock(4)); assertEquals(5, fs.getNextBlock(4)); // Main Stream
assertEquals(6, fs.getNextBlock(5)); assertEquals(6, fs.getNextBlock(5));
assertEquals(7, fs.getNextBlock(6)); assertEquals(7, fs.getNextBlock(6));
assertEquals(8, fs.getNextBlock(7)); assertEquals(8, fs.getNextBlock(7));
@ -946,7 +921,7 @@ if (1==0) {
// the properties stream going in at the end // the properties stream going in at the end
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0)); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
assertEquals(3, fs.getNextBlock(2)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3)); assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(3));
assertEquals(5, fs.getNextBlock(4)); assertEquals(5, fs.getNextBlock(4));
assertEquals(6, fs.getNextBlock(5)); assertEquals(6, fs.getNextBlock(5));
@ -976,10 +951,7 @@ if (1==0) {
inp = new NDocumentInputStream(miniDoc); inp = new NDocumentInputStream(miniDoc);
miniRead = new byte[miniDoc.getSize()]; miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead)); assertEquals(miniDoc.getSize(), inp.read(miniRead));
// TODO Fix mini stream write/read corruption
if(1==0) {
assertThat(mini, equalTo(miniRead)); assertThat(mini, equalTo(miniRead));
}
inp.close(); inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal4096"); normDoc = (DocumentEntry)testDir.getEntry("Normal4096");