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:
parent
59130c6193
commit
2c58431592
@ -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 =
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
||||
|
@ -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++)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user