POIFS Property refactoring ready for NIO support

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1051025 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2010-12-20 09:06:47 +00:00
parent 59130c6193
commit 2c58431592
7 changed files with 63 additions and 59 deletions

View File

@ -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 =

View File

@ -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

View File

@ -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(

View File

@ -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<Property> convertToProperties(ListManagedBlock [] blocks)
throws IOException
{
List properties = new ArrayList();
List<Property> properties = new ArrayList<Property>();
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<Property> 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

View File

@ -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++)

View File

@ -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;

View File

@ -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);