mirror of https://github.com/apache/poi.git
More PropertyTable refactoring - pull common code out into a Base, so we can plug in a different block reader/writer for NIO
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1051029 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
569cd51d33
commit
c9294875b0
|
@ -102,9 +102,10 @@ public class NPOIFSFileSystem
|
|||
*/
|
||||
public NPOIFSFileSystem()
|
||||
{
|
||||
_property_table = new PropertyTable(bigBlockSize);
|
||||
_blocks = new ArrayList<BATBlock>();
|
||||
_root = null;
|
||||
_header = new HeaderBlock(bigBlockSize);
|
||||
_property_table = new PropertyTable(_header);// TODO Needs correct type
|
||||
_blocks = new ArrayList<BATBlock>();
|
||||
_root = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -90,7 +90,8 @@ public class POIFSFileSystem
|
|||
*/
|
||||
public POIFSFileSystem()
|
||||
{
|
||||
_property_table = new PropertyTable(bigBlockSize);
|
||||
HeaderBlock header_block = new HeaderBlock(bigBlockSize);
|
||||
_property_table = new PropertyTable(header_block);
|
||||
_documents = new ArrayList();
|
||||
_root = null;
|
||||
}
|
||||
|
|
|
@ -19,13 +19,8 @@ package org.apache.poi.poifs.property;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
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;
|
||||
|
@ -38,18 +33,14 @@ import org.apache.poi.poifs.storage.RawDataBlockList;
|
|||
*
|
||||
* @author Marc Johnson (mjohnson at apache dot org)
|
||||
*/
|
||||
public final class PropertyTable implements BATManaged, BlockWritable {
|
||||
public final class PropertyTable extends PropertyTableBase implements BlockWritable {
|
||||
private POIFSBigBlockSize _bigBigBlockSize;
|
||||
private int _start_block;
|
||||
private List<Property> _properties;
|
||||
private BlockWritable[] _blocks;
|
||||
|
||||
public PropertyTable(POIFSBigBlockSize bigBlockSize)
|
||||
public PropertyTable(HeaderBlock headerBlock)
|
||||
{
|
||||
_bigBigBlockSize = bigBlockSize;
|
||||
_start_block = POIFSConstants.END_OF_CHAIN;
|
||||
_properties = new ArrayList<Property>();
|
||||
addProperty(new RootProperty());
|
||||
super(headerBlock);
|
||||
_bigBigBlockSize = headerBlock.getBigBlockSize();
|
||||
_blocks = null;
|
||||
}
|
||||
|
||||
|
@ -68,45 +59,14 @@ public final class PropertyTable implements BATManaged, BlockWritable {
|
|||
final RawDataBlockList blockList)
|
||||
throws IOException
|
||||
{
|
||||
_bigBigBlockSize = headerBlock.getBigBlockSize();
|
||||
_start_block = POIFSConstants.END_OF_CHAIN;
|
||||
_blocks = null;
|
||||
_properties = PropertyFactory.convertToProperties(
|
||||
blockList.fetchBlocks(headerBlock.getPropertyStart(), -1)
|
||||
super(
|
||||
headerBlock,
|
||||
PropertyFactory.convertToProperties(
|
||||
blockList.fetchBlocks(headerBlock.getPropertyStart(), -1)
|
||||
)
|
||||
);
|
||||
populatePropertyTree(( DirectoryProperty ) _properties.get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a property to the list of properties we manage
|
||||
*
|
||||
* @param property the new Property to manage
|
||||
*/
|
||||
public void addProperty(Property property)
|
||||
{
|
||||
_properties.add(property);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a property from the list of properties we manage
|
||||
*
|
||||
* @param property the Property to be removed
|
||||
*/
|
||||
public void removeProperty(final Property property)
|
||||
{
|
||||
_properties.remove(property);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the root property
|
||||
*
|
||||
* @return the root property
|
||||
*/
|
||||
public RootProperty getRoot()
|
||||
{
|
||||
|
||||
// it's always the first element in the List
|
||||
return ( RootProperty ) _properties.get(0);
|
||||
_bigBigBlockSize = headerBlock.getBigBlockSize();
|
||||
_blocks = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -132,52 +92,6 @@ public final class PropertyTable implements BATManaged, BlockWritable {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the start block for the property table
|
||||
*
|
||||
* @return start block index
|
||||
*/
|
||||
public int getStartBlock()
|
||||
{
|
||||
return _start_block;
|
||||
}
|
||||
|
||||
private void populatePropertyTree(DirectoryProperty root)
|
||||
throws IOException
|
||||
{
|
||||
int index = root.getChildIndex();
|
||||
|
||||
if (!Property.isValidIndex(index))
|
||||
{
|
||||
|
||||
// property has no children
|
||||
return;
|
||||
}
|
||||
Stack<Property> children = new Stack<Property>();
|
||||
|
||||
children.push(_properties.get(index));
|
||||
while (!children.empty())
|
||||
{
|
||||
Property property = children.pop();
|
||||
|
||||
root.addChild(property);
|
||||
if (property.isDirectory())
|
||||
{
|
||||
populatePropertyTree(( DirectoryProperty ) property);
|
||||
}
|
||||
index = property.getPreviousChildIndex();
|
||||
if (Property.isValidIndex(index))
|
||||
{
|
||||
children.push(_properties.get(index));
|
||||
}
|
||||
index = property.getNextChildIndex();
|
||||
if (Property.isValidIndex(index))
|
||||
{
|
||||
children.push(_properties.get(index));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of BigBlock's this instance uses
|
||||
*
|
||||
|
@ -189,17 +103,6 @@ public final class PropertyTable implements BATManaged, BlockWritable {
|
|||
: _blocks.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the start block for this instance
|
||||
*
|
||||
* @param index index into the array of BigBlock instances making
|
||||
* up the the filesystem
|
||||
*/
|
||||
public void setStartBlock(final int index)
|
||||
{
|
||||
_start_block = index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the storage to an OutputStream
|
||||
*
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
package org.apache.poi.poifs.property;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
import org.apache.poi.poifs.filesystem.BATManaged;
|
||||
import org.apache.poi.poifs.storage.HeaderBlock;
|
||||
|
||||
/**
|
||||
* This class embodies the Property Table for the filesystem,
|
||||
* which looks up entries in the filesystem to their
|
||||
* chain of blocks.
|
||||
* This is the core support, there are implementations
|
||||
* for the different block schemes as needed.
|
||||
*/
|
||||
public abstract class PropertyTableBase implements BATManaged {
|
||||
private final HeaderBlock _header_block;
|
||||
protected final List<Property> _properties;
|
||||
|
||||
public PropertyTableBase(final HeaderBlock header_block)
|
||||
{
|
||||
_header_block = header_block;
|
||||
_properties = new ArrayList<Property>();
|
||||
addProperty(new RootProperty());
|
||||
}
|
||||
|
||||
/**
|
||||
* Reading constructor (used when we've read in a file and we want
|
||||
* to extract the property table from it). Populates the
|
||||
* properties thoroughly
|
||||
*
|
||||
* @param startBlock the first block of the property table
|
||||
* @param blockList the list of blocks
|
||||
*
|
||||
* @exception IOException if anything goes wrong (which should be
|
||||
* a result of the input being NFG)
|
||||
*/
|
||||
public PropertyTableBase(final HeaderBlock header_block,
|
||||
final List<Property> properties)
|
||||
throws IOException
|
||||
{
|
||||
_header_block = header_block;
|
||||
_properties = properties;
|
||||
populatePropertyTree( (DirectoryProperty)_properties.get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a property to the list of properties we manage
|
||||
*
|
||||
* @param property the new Property to manage
|
||||
*/
|
||||
public void addProperty(Property property)
|
||||
{
|
||||
_properties.add(property);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a property from the list of properties we manage
|
||||
*
|
||||
* @param property the Property to be removed
|
||||
*/
|
||||
public void removeProperty(final Property property)
|
||||
{
|
||||
_properties.remove(property);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the root property
|
||||
*
|
||||
* @return the root property
|
||||
*/
|
||||
public RootProperty getRoot()
|
||||
{
|
||||
// it's always the first element in the List
|
||||
return ( RootProperty ) _properties.get(0);
|
||||
}
|
||||
|
||||
private void populatePropertyTree(DirectoryProperty root)
|
||||
throws IOException
|
||||
{
|
||||
int index = root.getChildIndex();
|
||||
|
||||
if (!Property.isValidIndex(index))
|
||||
{
|
||||
|
||||
// property has no children
|
||||
return;
|
||||
}
|
||||
Stack<Property> children = new Stack<Property>();
|
||||
|
||||
children.push(_properties.get(index));
|
||||
while (!children.empty())
|
||||
{
|
||||
Property property = children.pop();
|
||||
|
||||
root.addChild(property);
|
||||
if (property.isDirectory())
|
||||
{
|
||||
populatePropertyTree(( DirectoryProperty ) property);
|
||||
}
|
||||
index = property.getPreviousChildIndex();
|
||||
if (Property.isValidIndex(index))
|
||||
{
|
||||
children.push(_properties.get(index));
|
||||
}
|
||||
index = property.getNextChildIndex();
|
||||
if (Property.isValidIndex(index))
|
||||
{
|
||||
children.push(_properties.get(index));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the start block for the property table
|
||||
*
|
||||
* @return start block index
|
||||
*/
|
||||
public int getStartBlock()
|
||||
{
|
||||
return _header_block.getPropertyStart();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the start block for this instance
|
||||
*
|
||||
* @param index index into the array of BigBlock instances making
|
||||
* up the the filesystem
|
||||
*/
|
||||
public void setStartBlock(final int index)
|
||||
{
|
||||
_header_block.setPropertyStart(index);
|
||||
}
|
||||
}
|
|
@ -71,7 +71,8 @@ public final class TestPropertyTable extends TestCase {
|
|||
public void testWriterPropertyTable() throws IOException {
|
||||
|
||||
// create the PropertyTable
|
||||
PropertyTable table = new PropertyTable(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
|
||||
HeaderBlock headerBlock = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
|
||||
PropertyTable table = new PropertyTable(headerBlock);
|
||||
|
||||
// create three DocumentProperty instances and add them to the
|
||||
// PropertyTable
|
||||
|
|
|
@ -75,7 +75,9 @@ public final class TestSmallBlockTableWriter extends TestCase {
|
|||
documents
|
||||
.add(new POIFSDocument("doc9",
|
||||
new ByteArrayInputStream(new byte[ 9 ])));
|
||||
RootProperty root = new PropertyTable(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS).getRoot();
|
||||
|
||||
HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
|
||||
RootProperty root = new PropertyTable(header).getRoot();
|
||||
SmallBlockTableWriter sbtw = new SmallBlockTableWriter(
|
||||
POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, documents,root);
|
||||
BlockAllocationTableWriter bat = sbtw.getSBAT();
|
||||
|
|
Loading…
Reference in New Issue