You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/04/24 23:08:34 UTC
svn commit: r1589881 - in /poi/trunk/src:
java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java
testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java
Author: nick
Date: Thu Apr 24 21:08:34 2014
New Revision: 1589881
URL: http://svn.apache.org/r1589881
Log:
Correct NPOIFS mini stream first write bug, and add more NPOIFS stream write tests
Modified:
poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java
poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java
Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java?rev=1589881&r1=1589880&r2=1589881&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSMiniStore.java Thu Apr 24 21:08:34 2014
@@ -27,9 +27,9 @@ import java.util.List;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.property.RootProperty;
import org.apache.poi.poifs.storage.BATBlock;
+import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex;
import org.apache.poi.poifs.storage.BlockAllocationTableWriter;
import org.apache.poi.poifs.storage.HeaderBlock;
-import org.apache.poi.poifs.storage.BATBlock.BATBlockAndIndex;
/**
* This class handles the MiniStream (small block store)
@@ -86,6 +86,11 @@ public class NPOIFSMiniStore extends Blo
* Load the block, extending the underlying stream if needed
*/
protected ByteBuffer createBlockIfNeeded(final int offset) throws IOException {
+ // Ensure we have our first block at this point
+ if (_mini_stream.getStartBlock() == POIFSConstants.END_OF_CHAIN) {
+ getFreeBlock();
+ }
+
// Try to get it without extending the stream
try {
return getBlockAt(offset);
@@ -186,6 +191,7 @@ public class NPOIFSMiniStore extends Blo
if(_header.getSBATCount() == 0) {
_header.setSBATStart(batForSBAT);
_header.setSBATBlockCount(1);
+ _mini_stream = new NPOIFSStream(_filesystem, batForSBAT);
} else {
// Find the end of the SBAT stream, and add the sbat in there
ChainLoopDetector loopDetector = _filesystem.getChainLoopDetector();
Modified: poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java?rev=1589881&r1=1589880&r2=1589881&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java Thu Apr 24 21:08:34 2014
@@ -681,10 +681,140 @@ public final class TestNPOIFSFileSystem
assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(3));
assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock());
- // Now add a normal stream and a mini stream
- // TODO
- // TODO The rest of the test
+ // Put everything within a new directory
+ DirectoryEntry testDir = fs.createDirectory("Test Directory");
+
+ // Add a new Normal Stream (Normal Streams minimum 4096 bytes)
+ byte[] main4096 = new byte[4096];
+ main4096[0] = -10;
+ main4096[4095] = -11;
+ testDir.createDocument("Normal4096", new ByteArrayInputStream(main4096));
+
+ assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
+ if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) {
+ assertEquals(4, fs.getNextBlock(3));
+ assertEquals(5, fs.getNextBlock(4));
+ assertEquals(6, fs.getNextBlock(5));
+ assertEquals(7, fs.getNextBlock(6));
+ assertEquals(8, fs.getNextBlock(7));
+ assertEquals(9, fs.getNextBlock(8));
+ assertEquals(10, fs.getNextBlock(9));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(10));
+ 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());
+
+
+ // Add a bigger Normal Stream
+ byte[] main5124 = new byte[5124];
+ main5124[0] = -22;
+ main5124[5123] = -33;
+ testDir.createDocument("Normal5124", new ByteArrayInputStream(main5124));
+
+ assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
+ if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) {
+ assertEquals(4, fs.getNextBlock(3));
+ assertEquals(5, fs.getNextBlock(4));
+ assertEquals(6, fs.getNextBlock(5));
+ assertEquals(7, fs.getNextBlock(6));
+ assertEquals(8, fs.getNextBlock(7));
+ assertEquals(9, fs.getNextBlock(8));
+ assertEquals(10, fs.getNextBlock(9));
+ 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));
+ } 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());
+
+
+ // Now Add a mini stream
+ byte[] mini = new byte[] { 0, 1, 2, 3, 4 };
+ testDir.createDocument("Mini", new ByteArrayInputStream(mini));
+
+ // Mini stream will get one block for fat + one block for data
+ assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(2));
+ if (fs.getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE) {
+ assertEquals(4, fs.getNextBlock(3));
+ assertEquals(5, fs.getNextBlock(4));
+ assertEquals(6, fs.getNextBlock(5));
+ assertEquals(7, fs.getNextBlock(6));
+ assertEquals(8, fs.getNextBlock(7));
+ assertEquals(9, fs.getNextBlock(8));
+ assertEquals(10, fs.getNextBlock(9));
+ 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(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));
+ }
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getRoot().getProperty().getStartBlock());
+
+
+ // Write and read back
+ // TODO
+ }
+
+ @Test
+ public void addBeforeWrite() throws Exception {
+ NPOIFSFileSystem fs = new NPOIFSFileSystem();
+
+ // Initially has BAT + Properties but nothing else
+ assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs.getNextBlock(0));
+ assertEquals(POIFSConstants.END_OF_CHAIN, fs.getNextBlock(1));
+ assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(2));
+
+ // Add to the mini stream
+ // TODO
+
+ // Add to the main stream
+ // TODO
+
+ // Write, read, check
+ // TODO
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org