FileDocCategorySizeDatePackage
SmallDocumentBlock.javaAPI DocApache Poi 3.0.18954Mon Jan 01 12:39:36 GMT 2007org.apache.poi.poifs.storage

SmallDocumentBlock

public class SmallDocumentBlock extends Object implements BlockWritable, ListManagedBlock
Storage for documents that are too small to use regular DocumentBlocks for their data
author
Marc Johnson (mjohnson at apache dot org)

Fields Summary
private byte[]
_data
private static final byte
_default_fill
private static final int
_block_size
private static final int
_blocks_per_big_block
Constructors Summary
private SmallDocumentBlock(byte[] data, int index)


           
    
        this();
        System.arraycopy(data, index * _block_size, _data, 0, _block_size);
    
private SmallDocumentBlock()

        _data = new byte[ _block_size ];
    
Methods Summary
public static intcalcSize(int size)
Calculate the storage size of a set of SmallDocumentBlocks

param
size number of SmallDocumentBlocks
return
total size

        return size * _block_size;
    
public static org.apache.poi.poifs.storage.SmallDocumentBlock[]convert(byte[] array, int size)
convert a single long array into an array of SmallDocumentBlock instances

param
array the byte array to be converted
param
size the intended size of the array (which may be smaller)
return
an array of SmallDocumentBlock instances, filled from the array

        SmallDocumentBlock[] rval   =
            new SmallDocumentBlock[ (size + _block_size - 1) / _block_size ];
        int                  offset = 0;

        for (int k = 0; k < rval.length; k++)
        {
            rval[ k ] = new SmallDocumentBlock();
            if (offset < array.length)
            {
                int length = Math.min(_block_size, array.length - offset);

                System.arraycopy(array, offset, rval[ k ]._data, 0, length);
                if (length != _block_size)
                {
                    Arrays.fill(rval[ k ]._data, length, _block_size,
                                _default_fill);
                }
            }
            else
            {
                Arrays.fill(rval[ k ]._data, _default_fill);
            }
            offset += _block_size;
        }
        return rval;
    
public static org.apache.poi.poifs.storage.SmallDocumentBlock[]convert(org.apache.poi.poifs.storage.BlockWritable[] store, int size)
Factory for creating SmallDocumentBlocks from DocumentBlocks

param
store the original DocumentBlocks
param
size the total document size
return
an array of new SmallDocumentBlocks instances
exception
IOException on errors reading from the DocumentBlocks
exception
ArrayIndexOutOfBoundsException if, somehow, the store contains less data than size indicates

        ByteArrayOutputStream stream = new ByteArrayOutputStream();

        for (int j = 0; j < store.length; j++)
        {
            store[ j ].writeBlocks(stream);
        }
        byte[]               data = stream.toByteArray();
        SmallDocumentBlock[] rval =
            new SmallDocumentBlock[ convertToBlockCount(size) ];

        for (int index = 0; index < rval.length; index++)
        {
            rval[ index ] = new SmallDocumentBlock(data, index);
        }
        return rval;
    
private static intconvertToBlockCount(int size)

        return (size + _block_size - 1) / _block_size;
    
public static java.util.Listextract(org.apache.poi.poifs.storage.ListManagedBlock[] blocks)
create a list of SmallDocumentBlock's from raw data

param
blocks the raw data containing the SmallDocumentBlock data
return
a List of SmallDocumentBlock's extracted from the input
exception
IOException

        List sdbs = new ArrayList();

        for (int j = 0; j < blocks.length; j++)
        {
            byte[] data = blocks[ j ].getData();

            for (int k = 0; k < _blocks_per_big_block; k++)
            {
                sdbs.add(new SmallDocumentBlock(data, k));
            }
        }
        return sdbs;
    
public static intfill(java.util.List blocks)
fill out a List of SmallDocumentBlocks so that it fully occupies a set of big blocks

param
blocks the List to be filled out
return
number of big blocks the list encompasses

        int count           = blocks.size();
        int big_block_count = (count + _blocks_per_big_block - 1)
                              / _blocks_per_big_block;
        int full_count      = big_block_count * _blocks_per_big_block;

        for (; count < full_count; count++)
        {
            blocks.add(makeEmptySmallDocumentBlock());
        }
        return big_block_count;
    
public byte[]getData()
Get the data from the block

return
the block's data as a byte array
exception
IOException if there is no data

        return _data;
    
private static org.apache.poi.poifs.storage.SmallDocumentBlockmakeEmptySmallDocumentBlock()

        SmallDocumentBlock block = new SmallDocumentBlock();

        Arrays.fill(block._data, _default_fill);
        return block;
    
public static voidread(org.apache.poi.poifs.storage.BlockWritable[] blocks, byte[] buffer, int offset)
read data from an array of SmallDocumentBlocks

param
blocks the blocks to read from
param
buffer the buffer to write the data into
param
offset the offset into the array of blocks to read from

        int firstBlockIndex  = offset / _block_size;
        int firstBlockOffset = offset % _block_size;
        int lastBlockIndex   = (offset + buffer.length - 1) / _block_size;

        if (firstBlockIndex == lastBlockIndex)
        {
            System.arraycopy(
                (( SmallDocumentBlock ) blocks[ firstBlockIndex ])._data,
                firstBlockOffset, buffer, 0, buffer.length);
        }
        else
        {
            int buffer_offset = 0;

            System.arraycopy(
                (( SmallDocumentBlock ) blocks[ firstBlockIndex ])._data,
                firstBlockOffset, buffer, buffer_offset,
                _block_size - firstBlockOffset);
            buffer_offset += _block_size - firstBlockOffset;
            for (int j = firstBlockIndex + 1; j < lastBlockIndex; j++)
            {
                System.arraycopy((( SmallDocumentBlock ) blocks[ j ])._data,
                                 0, buffer, buffer_offset, _block_size);
                buffer_offset += _block_size;
            }
            System.arraycopy(
                (( SmallDocumentBlock ) blocks[ lastBlockIndex ])._data, 0,
                buffer, buffer_offset, buffer.length - buffer_offset);
        }
    
public voidwriteBlocks(java.io.OutputStream stream)
Write the storage to an OutputStream

param
stream the OutputStream to which the stored data should be written
exception
IOException on problems writing to the specified stream

        stream.write(_data);