From 569cd51d333dba08efba60bd18ff97fc14091eb8 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 20 Dec 2010 09:06:47 +0000 Subject: [PATCH] POIFS Property refactoring ready for NIO support git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1051025 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/poifs/dev/POIFSHeaderDumper.java | 5 +- .../poifs/eventfilesystem/POIFSReader.java | 6 +- .../poi/poifs/filesystem/POIFSFileSystem.java | 4 +- .../poi/poifs/property/PropertyFactory.java | 79 ++++++++++--------- .../poi/poifs/property/PropertyTable.java | 14 ++-- .../poi/poifs/property/TestPropertyTable.java | 8 +- .../storage/TestSmallBlockTableReader.java | 6 +- 7 files changed, 63 insertions(+), 59 deletions(-) diff --git a/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java b/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java index cd183b3ba4..25a28d40cb 100644 --- a/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java +++ b/src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java @@ -83,10 +83,7 @@ public class POIFSHeaderDumper { // Properties Table PropertyTable properties = - new PropertyTable( - header_block.getBigBlockSize(), - header_block.getPropertyStart(), - data_blocks); + new PropertyTable(header_block, data_blocks); // Mini Fat BlockList sbat = diff --git a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java index 4504226227..567527523e 100644 --- a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java +++ b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java @@ -78,7 +78,7 @@ public class POIFSReader HeaderBlock header_block = new HeaderBlock(stream); // read the rest of the stream into blocks - RawDataBlockList data_blocks = new RawDataBlockList(stream, header_block.getBigBlockSize()); + RawDataBlockList data_blocks = new RawDataBlockList(stream, header_block.getBigBlockSize()); // set up the block allocation table (necessary for the // data_blocks to be manageable @@ -91,9 +91,7 @@ public class POIFSReader // get property table from the document PropertyTable properties = - new PropertyTable(header_block.getBigBlockSize(), - header_block.getPropertyStart(), - data_blocks); + new PropertyTable(header_block, data_blocks); // process documents processProperties(SmallBlockTableReader diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java index aa8e2966db..c217f025f4 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java @@ -156,9 +156,7 @@ public class POIFSFileSystem // get property table from the document PropertyTable properties = - new PropertyTable(bigBlockSize, - header_block.getPropertyStart(), - data_blocks); + new PropertyTable(header_block, data_blocks); // init documents processProperties( diff --git a/src/java/org/apache/poi/poifs/property/PropertyFactory.java b/src/java/org/apache/poi/poifs/property/PropertyFactory.java index 7dc92df2e6..38533b71a7 100644 --- a/src/java/org/apache/poi/poifs/property/PropertyFactory.java +++ b/src/java/org/apache/poi/poifs/property/PropertyFactory.java @@ -40,7 +40,6 @@ import org.apache.poi.poifs.storage.ListManagedBlock; class PropertyFactory { - // no need for an accessible constructor private PropertyFactory() { @@ -56,48 +55,52 @@ class PropertyFactory * * @exception IOException if any of the blocks are empty */ - - static List convertToProperties(ListManagedBlock [] blocks) + static List convertToProperties(ListManagedBlock [] blocks) throws IOException { - List properties = new ArrayList(); + List properties = new ArrayList(); - for (int j = 0; j < blocks.length; j++) - { - byte[] data = blocks[ j ].getData(); - int property_count = data.length - / POIFSConstants.PROPERTY_SIZE; - int offset = 0; - - for (int k = 0; k < property_count; k++) - { - switch (data[ offset + PropertyConstants.PROPERTY_TYPE_OFFSET ]) - { - - case PropertyConstants.DIRECTORY_TYPE : - properties - .add(new DirectoryProperty(properties.size(), - data, offset)); - break; - - case PropertyConstants.DOCUMENT_TYPE : - properties.add(new DocumentProperty(properties.size(), - data, offset)); - break; - - case PropertyConstants.ROOT_TYPE : - properties.add(new RootProperty(properties.size(), - data, offset)); - break; - - default : - properties.add(null); - break; - } - offset += POIFSConstants.PROPERTY_SIZE; - } + for (int j = 0; j < blocks.length; j++) { + byte[] data = blocks[ j ].getData(); + convertToProperties(data, properties); } return properties; } + + static void convertToProperties(byte[] data, List properties) + throws IOException + { + int property_count = data.length / POIFSConstants.PROPERTY_SIZE; + int offset = 0; + + for (int k = 0; k < property_count; k++) { + switch (data[ offset + PropertyConstants.PROPERTY_TYPE_OFFSET ]) { + case PropertyConstants.DIRECTORY_TYPE : + properties.add( + new DirectoryProperty(properties.size(), data, offset) + ); + break; + + case PropertyConstants.DOCUMENT_TYPE : + properties.add( + new DocumentProperty(properties.size(), data, offset) + ); + break; + + case PropertyConstants.ROOT_TYPE : + properties.add( + new RootProperty(properties.size(), data, offset) + ); + break; + + default : + properties.add(null); + break; + } + + offset += POIFSConstants.PROPERTY_SIZE; + } + } + } // end package scope class PropertyFactory diff --git a/src/java/org/apache/poi/poifs/property/PropertyTable.java b/src/java/org/apache/poi/poifs/property/PropertyTable.java index cce2a5a16e..03475bd3a9 100644 --- a/src/java/org/apache/poi/poifs/property/PropertyTable.java +++ b/src/java/org/apache/poi/poifs/property/PropertyTable.java @@ -27,6 +27,7 @@ import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.filesystem.BATManaged; import org.apache.poi.poifs.storage.BlockWritable; +import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.PropertyBlock; import org.apache.poi.poifs.storage.RawDataBlockList; @@ -63,17 +64,16 @@ public final class PropertyTable implements BATManaged, BlockWritable { * @exception IOException if anything goes wrong (which should be * a result of the input being NFG) */ - public PropertyTable(final POIFSBigBlockSize bigBlockSize, - final int startBlock, + public PropertyTable(final HeaderBlock headerBlock, final RawDataBlockList blockList) throws IOException { - _bigBigBlockSize = bigBlockSize; + _bigBigBlockSize = headerBlock.getBigBlockSize(); _start_block = POIFSConstants.END_OF_CHAIN; _blocks = null; - _properties = - PropertyFactory - .convertToProperties(blockList.fetchBlocks(startBlock, -1)); + _properties = PropertyFactory.convertToProperties( + blockList.fetchBlocks(headerBlock.getPropertyStart(), -1) + ); populatePropertyTree(( DirectoryProperty ) _properties.get(0)); } @@ -114,7 +114,7 @@ public final class PropertyTable implements BATManaged, BlockWritable { */ public void preWrite() { - Property[] properties = _properties.toArray(new Property[ 0 ]); + Property[] properties = _properties.toArray(new Property[_properties.size()]); // give each property its index for (int k = 0; k < properties.length; k++) diff --git a/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java b/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java index 0e404d4881..8865eb3f57 100644 --- a/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java +++ b/src/testcases/org/apache/poi/poifs/property/TestPropertyTable.java @@ -27,6 +27,7 @@ import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.storage.BlockAllocationTableReader; +import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.RawDataBlockList; import org.apache.poi.poifs.storage.RawDataUtil; @@ -438,9 +439,12 @@ public final class TestPropertyTable extends TestCase { new BlockAllocationTableReader( POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, bat_array, 0, -2, data_blocks); + // Fake up a header + HeaderBlock header_block = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + header_block.setPropertyStart(0); + // get property table from the document - PropertyTable table = new PropertyTable( - POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 0, data_blocks); + PropertyTable table = new PropertyTable(header_block, data_blocks); assertEquals(30 * 64, table.getRoot().getSize()); int count = 0; diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java index 3d254f8261..ee8ac39d59 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableReader.java @@ -302,9 +302,13 @@ public final class TestSmallBlockTableReader extends TestCase { // need to initialize the block list with a block allocation // table new BlockAllocationTableReader(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 1, bat_array, 0, -2, data_blocks); + + // Fake up a header + HeaderBlock header_block = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); + header_block.setPropertyStart(0); // get property table from the document - PropertyTable properties = new PropertyTable(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, 0, data_blocks); + PropertyTable properties = new PropertyTable(header_block, data_blocks); RootProperty root = properties.getRoot(); BlockList bl = SmallBlockTableReader.getSmallDocumentBlocks( POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, data_blocks, root, 14);