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