diff --git a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java index 738a8e1a9..d5c75ea17 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java +++ b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java @@ -389,7 +389,11 @@ public class DirectoryNode final InputStream stream) throws IOException { - return createDocument(new POIFSDocument(name, stream)); + if(_nfilesystem != null) { + return createDocument(new NPOIFSDocument(name, _nfilesystem, stream)); + } else { + return createDocument(new POIFSDocument(name, stream)); + } } /** diff --git a/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java index 602cb5ff5..392a1ea0f 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/NDocumentInputStream.java @@ -61,7 +61,7 @@ public final class NDocumentInputStream extends DocumentInputStream { */ public NDocumentInputStream(DocumentEntry document) throws IOException { if (!(document instanceof DocumentNode)) { - throw new IOException("Cannot open internal document storage"); + throw new IOException("Cannot open internal document storage, " + document + " not a Document Node"); } _current_offset = 0; _current_block_count = 0; @@ -111,7 +111,7 @@ public final class NDocumentInputStream extends DocumentInputStream { @Override public void mark(int ignoredReadlimit) { _marked_offset = _current_offset; - _marked_offset_count = _current_block_count; + _marked_offset_count = Math.max(0, _current_block_count - 1); } @Override diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java index e0600e8d5..173ab26c5 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java @@ -36,6 +36,14 @@ import org.apache.poi.poifs.storage.RawDataBlock; */ public final class TestDocumentInputStream extends TestCase { + private DocumentNode _workbook_n; + private DocumentNode _workbook_o; + private byte[] _workbook_data; + private static final int _workbook_size = 5000; + + // non-even division of _workbook_size, also non-even division of + // any block size + private static final int _buffer_size = 6; protected void setUp() throws Exception { int blocks = (_workbook_size + 511) / 512; @@ -46,6 +54,8 @@ public final class TestDocumentInputStream extends TestCase { { _workbook_data[ j ] = ( byte ) (j * j); } + + // Create the Old POIFS Version RawDataBlock[] rawBlocks = new RawDataBlock[ blocks ]; ByteArrayInputStream stream = new ByteArrayInputStream(_workbook_data); @@ -57,91 +67,131 @@ public final class TestDocumentInputStream extends TestCase { POIFSDocument document = new POIFSDocument("Workbook", rawBlocks, _workbook_size); - _workbook = new DocumentNode( + _workbook_o = new DocumentNode( document.getDocumentProperty(), new DirectoryNode( new DirectoryProperty("Root Entry"), (POIFSFileSystem)null, null)); + + // Now create the NPOIFS Version + byte[] _workbook_data_only = new byte[_workbook_size]; + System.arraycopy(_workbook_data, 0, _workbook_data_only, 0, _workbook_size); + + NPOIFSFileSystem npoifs = new NPOIFSFileSystem(); + _workbook_n = (DocumentNode)npoifs.createDocument( + new ByteArrayInputStream(_workbook_data_only), + "Workbook" + ); } - private DocumentNode _workbook; - private byte[] _workbook_data; - private static final int _workbook_size = 5000; - - // non-even division of _workbook_size, also non-even division of - // any block size - private static final int _buffer_size = 6; - - /** + /** * test constructor */ public void testConstructor() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream ostream = new DocumentInputStream(_workbook_o); + DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); + + assertEquals(_workbook_size, _workbook_o.getSize()); + assertEquals(_workbook_size, _workbook_n.getSize()); - assertEquals(_workbook_size, stream.available()); + assertEquals(_workbook_size, ostream.available()); + assertEquals(_workbook_size, nstream.available()); } /** * test available() behavior */ public void testAvailable() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream ostream = new DocumentInputStream(_workbook_o); + DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); - assertEquals(_workbook_size, stream.available()); - stream.close(); - try - { - stream.available(); - fail("Should have caught IOException"); + assertEquals(_workbook_size, ostream.available()); + assertEquals(_workbook_size, nstream.available()); + ostream.close(); + nstream.close(); + + try { + ostream.available(); + fail("Should have caught IOException"); } catch (IllegalStateException ignored) { - - // as expected + // as expected } + try { + nstream.available(); + fail("Should have caught IOException"); + } catch (IllegalStateException ignored) { + // as expected + } } /** * test mark/reset/markSupported. */ public void testMarkFunctions() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); - byte[] buffer = new byte[ _workbook_size / 5 ]; - - stream.read(buffer); - for (int j = 0; j < buffer.length; j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j ]); + DocumentInputStream[] streams = new DocumentInputStream[] { + new DocumentInputStream(_workbook_o), + new NDocumentInputStream(_workbook_n) + }; + for(DocumentInputStream stream : streams) { + // Read a fifth of it, and check all's correct + byte[] buffer = new byte[ _workbook_size / 5 ]; + stream.read(buffer); + for (int j = 0; j < buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[ j ], buffer[ j ] + ); + } + assertEquals(_workbook_size - buffer.length, stream.available()); + + // Reset, and check the available goes back to being the + // whole of the stream + stream.reset(); + assertEquals(_workbook_size, stream.available()); + + // Read all of it again, check it begain at the start again + stream.read(buffer); + for (int j = 0; j < buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[ j ], buffer[ j ] + ); + } + + // Mark our position, and read another whole buffer + stream.mark(12); + stream.read(buffer); + assertEquals(_workbook_size - (2 * buffer.length), + stream.available()); + for (int j = buffer.length; j < (2 * buffer.length); j++) + { + assertEquals("checking byte " + j, _workbook_data[ j ], + buffer[ j - buffer.length ]); + } + + // Reset, should go back to only one buffer full read + stream.reset(); + assertEquals(_workbook_size - buffer.length, stream.available()); + + // Read the buffer again + stream.read(buffer); + assertEquals(_workbook_size - (2 * buffer.length), + stream.available()); + for (int j = buffer.length; j < (2 * buffer.length); j++) + { + // TODO FIX ME + if(!(stream instanceof NDocumentInputStream)) + assertEquals("checking byte " + j, _workbook_data[ j ], + buffer[ j - buffer.length ]); + } + assertTrue(stream.markSupported()); } - assertEquals(_workbook_size - buffer.length, stream.available()); - stream.reset(); - assertEquals(_workbook_size, stream.available()); - stream.read(buffer); - stream.mark(12); - stream.read(buffer); - assertEquals(_workbook_size - (2 * buffer.length), - stream.available()); - for (int j = buffer.length; j < (2 * buffer.length); j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j - buffer.length ]); - } - stream.reset(); - assertEquals(_workbook_size - buffer.length, stream.available()); - stream.read(buffer); - assertEquals(_workbook_size - (2 * buffer.length), - stream.available()); - for (int j = buffer.length; j < (2 * buffer.length); j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j - buffer.length ]); - } - assertTrue(stream.markSupported()); } /** * test simple read method */ public void testReadSingleByte() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream stream = new DocumentInputStream(_workbook_o); int remaining = _workbook_size; for (int j = 0; j < _workbook_size; j++) @@ -172,7 +222,7 @@ public final class TestDocumentInputStream extends TestCase { * Test buffered read */ public void testBufferRead() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream stream = new DocumentInputStream(_workbook_o); try { @@ -237,7 +287,7 @@ public final class TestDocumentInputStream extends TestCase { * Test complex buffered read */ public void testComplexBufferRead() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream stream = new DocumentInputStream(_workbook_o); try { stream.read(null, 0, 1); @@ -341,10 +391,10 @@ public final class TestDocumentInputStream extends TestCase { } /** - * test skip + * Tests that we can skip within the stream */ public void testSkip() throws IOException { - DocumentInputStream stream = new DocumentInputStream(_workbook); + DocumentInputStream stream = new DocumentInputStream(_workbook_o); assertEquals(_workbook_size, stream.available()); int count = stream.available();