From: Nick Burch Date: Mon, 11 May 2015 18:15:03 +0000 (+0000) Subject: #56791 More updates from OPOIFS to NPOIFS X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=aec457dbcb9c67a1d5d95e733d1e869bdaad401b;p=poi.git #56791 More updates from OPOIFS to NPOIFS git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1678787 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java index 567527523e..a288709185 100644 --- a/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java +++ b/src/java/org/apache/poi/poifs/eventfilesystem/POIFSReader.java @@ -24,7 +24,7 @@ import java.io.*; import java.util.*; import org.apache.poi.poifs.filesystem.DocumentInputStream; -import org.apache.poi.poifs.filesystem.POIFSDocument; +import org.apache.poi.poifs.filesystem.OPOIFSDocument; import org.apache.poi.poifs.filesystem.POIFSDocumentPath; import org.apache.poi.poifs.property.DirectoryProperty; import org.apache.poi.poifs.property.Property; @@ -240,19 +240,19 @@ public class POIFSReader if (listeners.hasNext()) { - int size = property.getSize(); - POIFSDocument document = null; + int size = property.getSize(); + OPOIFSDocument document = null; if (property.shouldUseSmallBlocks()) { document = - new POIFSDocument(name, small_blocks + new OPOIFSDocument(name, small_blocks .fetchBlocks(startBlock, -1), size); } else { document = - new POIFSDocument(name, big_blocks + new OPOIFSDocument(name, big_blocks .fetchBlocks(startBlock, -1), size); } while (listeners.hasNext()) diff --git a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java index c1d4a25b03..e8c6638bf6 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java +++ b/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java @@ -217,7 +217,7 @@ public class DirectoryNode * * @exception IOException */ - DocumentEntry createDocument(final POIFSDocument document) + DocumentEntry createDocument(final OPOIFSDocument document) throws IOException { DocumentProperty property = document.getDocumentProperty(); @@ -418,7 +418,7 @@ public class DirectoryNode if(_nfilesystem != null) { return createDocument(new NPOIFSDocument(name, _nfilesystem, stream)); } else { - return createDocument(new POIFSDocument(name, stream)); + return createDocument(new OPOIFSDocument(name, stream)); } } @@ -441,7 +441,7 @@ public class DirectoryNode if(_nfilesystem != null) { return createDocument(new NPOIFSDocument(name, size, _nfilesystem, writer)); } else { - return createDocument(new POIFSDocument(name, size, _path, writer)); + return createDocument(new OPOIFSDocument(name, size, _path, writer)); } } diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java index 6c6b6100c0..35d0c23655 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/DocumentInputStream.java @@ -72,7 +72,7 @@ public class DocumentInputStream extends InputStream implements LittleEndianInpu * * @param document the Document to be read */ - public DocumentInputStream(POIFSDocument document) { + public DocumentInputStream(OPOIFSDocument document) { delegate = new ODocumentInputStream(document); } diff --git a/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java b/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java index 9caafb7668..7a5bf69009 100644 --- a/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java +++ b/src/java/org/apache/poi/poifs/filesystem/DocumentNode.java @@ -27,18 +27,15 @@ import org.apache.poi.poifs.dev.POIFSViewable; import org.apache.poi.poifs.property.DocumentProperty; /** - * Simple implementation of DocumentEntry - * - * @author Marc Johnson (mjohnson at apache dot org) + * Simple implementation of DocumentEntry for OPOIFS */ - public class DocumentNode extends EntryNode implements DocumentEntry, POIFSViewable { // underlying POIFSDocument instance - private POIFSDocument _document; + private OPOIFSDocument _document; /** * create a DocumentNode. This method is not public by design; it @@ -59,8 +56,7 @@ public class DocumentNode * * @return the internal POIFSDocument */ - - POIFSDocument getDocument() + OPOIFSDocument getDocument() { return _document; } diff --git a/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java b/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java index a1bc5da95f..858e2d9d9b 100644 --- a/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java +++ b/src/java/org/apache/poi/poifs/filesystem/ODocumentInputStream.java @@ -23,9 +23,7 @@ import org.apache.poi.poifs.storage.DataInputBlock; /** * This class provides methods to read a DocumentEntry managed by a - * {@link POIFSFileSystem} instance. - * - * @author Marc Johnson (mjohnson at apache dot org) + * {@link OPOIFSFileSystem} instance. */ public final class ODocumentInputStream extends DocumentInputStream { /** current offset into the Document */ @@ -41,7 +39,7 @@ public final class ODocumentInputStream extends DocumentInputStream { private boolean _closed; /** the actual Document */ - private POIFSDocument _document; + private OPOIFSDocument _document; /** the data block containing the current stream pointer */ private DataInputBlock _currentBlock; @@ -59,7 +57,7 @@ public final class ODocumentInputStream extends DocumentInputStream { throw new IOException("Cannot open internal document storage"); } DocumentNode documentNode = (DocumentNode)document; - if(documentNode.getDocument() == null) { + if (documentNode.getDocument() == null) { throw new IOException("Cannot open internal document storage"); } @@ -76,7 +74,7 @@ public final class ODocumentInputStream extends DocumentInputStream { * * @param document the Document to be read */ - public ODocumentInputStream(POIFSDocument document) { + public ODocumentInputStream(OPOIFSDocument document) { _current_offset = 0; _marked_offset = 0; _document_size = document.getSize(); diff --git a/src/java/org/apache/poi/poifs/filesystem/OPOIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/OPOIFSDocument.java new file mode 100644 index 0000000000..3862b2987a --- /dev/null +++ b/src/java/org/apache/poi/poifs/filesystem/OPOIFSDocument.java @@ -0,0 +1,567 @@ +/* ==================================================================== + 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.filesystem; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.apache.poi.poifs.common.POIFSBigBlockSize; +import org.apache.poi.poifs.common.POIFSConstants; +import org.apache.poi.poifs.dev.POIFSViewable; +import org.apache.poi.poifs.property.DocumentProperty; +import org.apache.poi.poifs.property.Property; +import org.apache.poi.poifs.storage.BlockWritable; +import org.apache.poi.poifs.storage.DataInputBlock; +import org.apache.poi.poifs.storage.DocumentBlock; +import org.apache.poi.poifs.storage.ListManagedBlock; +import org.apache.poi.poifs.storage.RawDataBlock; +import org.apache.poi.poifs.storage.SmallDocumentBlock; +import org.apache.poi.util.HexDump; + +/** + * This class manages a document in a old-style + * OPOIFS filesystem. + */ +public final class OPOIFSDocument implements BATManaged, BlockWritable, POIFSViewable { + private static final DocumentBlock[] EMPTY_BIG_BLOCK_ARRAY = { }; + private static final SmallDocumentBlock[] EMPTY_SMALL_BLOCK_ARRAY = { }; + private DocumentProperty _property; + private int _size; + + private final POIFSBigBlockSize _bigBigBlockSize; + + // one of these stores will be valid + private SmallBlockStore _small_store; + private BigBlockStore _big_store; + + /** + * Constructor from large blocks + * + * @param name the name of the POIFSDocument + * @param blocks the big blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public OPOIFSDocument(String name, RawDataBlock[] blocks, int length) throws IOException { + _size = length; + if(blocks.length == 0) { + _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + } else { + _bigBigBlockSize = (blocks[0].getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE ? + POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS : + POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS + ); + } + + _big_store = new BigBlockStore(_bigBigBlockSize, convertRawBlocksToBigBlocks(blocks)); + _property = new DocumentProperty(name, _size); + _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); + _property.setDocument(this); + } + + // TODO - awkward typing going on here + private static DocumentBlock[] convertRawBlocksToBigBlocks(ListManagedBlock[] blocks) throws IOException { + DocumentBlock[] result = new DocumentBlock[blocks.length]; + for (int i = 0; i < result.length; i++) { + result[i] = new DocumentBlock((RawDataBlock)blocks[i]); + } + return result; + } + private static SmallDocumentBlock[] convertRawBlocksToSmallBlocks(ListManagedBlock[] blocks) { + if (blocks instanceof SmallDocumentBlock[]) { + return (SmallDocumentBlock[]) blocks; + } + SmallDocumentBlock[] result = new SmallDocumentBlock[blocks.length]; + System.arraycopy(blocks, 0, result, 0, blocks.length); + return result; + } + + /** + * Constructor from small blocks + * + * @param name the name of the POIFSDocument + * @param blocks the small blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public OPOIFSDocument(String name, SmallDocumentBlock[] blocks, int length) { + _size = length; + + if(blocks.length == 0) { + _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + } else { + _bigBigBlockSize = blocks[0].getBigBlockSize(); + } + + _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); + _property = new DocumentProperty(name, _size); + _small_store = new SmallBlockStore(_bigBigBlockSize, blocks); + _property.setDocument(this); + } + + /** + * Constructor from small blocks + * + * @param name the name of the POIFSDocument + * @param blocks the small blocks making up the POIFSDocument + * @param length the actual length of the POIFSDocument + */ + public OPOIFSDocument(String name, POIFSBigBlockSize bigBlockSize, ListManagedBlock[] blocks, int length) throws IOException { + _size = length; + _bigBigBlockSize = bigBlockSize; + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (Property.isSmall(_size)) { + _big_store = new BigBlockStore(bigBlockSize,EMPTY_BIG_BLOCK_ARRAY); + _small_store = new SmallBlockStore(bigBlockSize,convertRawBlocksToSmallBlocks(blocks)); + } else { + _big_store = new BigBlockStore(bigBlockSize,convertRawBlocksToBigBlocks(blocks)); + _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); + } + } + public OPOIFSDocument(String name, ListManagedBlock[] blocks, int length) throws IOException { + this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, blocks, length); + } + + /** + * Constructor + * + * @param name the name of the POIFSDocument + * @param stream the InputStream we read data from + */ + public OPOIFSDocument(String name, POIFSBigBlockSize bigBlockSize, InputStream stream) throws IOException { + List blocks = new ArrayList(); + + _size = 0; + _bigBigBlockSize = bigBlockSize; + while (true) { + DocumentBlock block = new DocumentBlock(stream, bigBlockSize); + int blockSize = block.size(); + + if (blockSize > 0) { + blocks.add(block); + _size += blockSize; + } + if (block.partiallyRead()) { + break; + } + } + DocumentBlock[] bigBlocks = blocks.toArray(new DocumentBlock[blocks.size()]); + + _big_store = new BigBlockStore(bigBlockSize,bigBlocks); + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (_property.shouldUseSmallBlocks()) { + _small_store = new SmallBlockStore(bigBlockSize,SmallDocumentBlock.convert(bigBlockSize,bigBlocks, _size)); + _big_store = new BigBlockStore(bigBlockSize,new DocumentBlock[0]); + } else { + _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); + } + } + public OPOIFSDocument(String name, InputStream stream) throws IOException { + this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, stream); + } + + /** + * Constructor + * + * @param name the name of the POIFSDocument + * @param size the length of the POIFSDocument + * @param path the path of the POIFSDocument + * @param writer the writer who will eventually write the document contents + */ + public OPOIFSDocument(String name, int size, POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, POIFSWriterListener writer) { + _size = size; + _bigBigBlockSize = bigBlockSize; + _property = new DocumentProperty(name, _size); + _property.setDocument(this); + if (_property.shouldUseSmallBlocks()) { + _small_store = new SmallBlockStore(_bigBigBlockSize, path, name, size, writer); + _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); + } else { + _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); + _big_store = new BigBlockStore(_bigBigBlockSize, path, name, size, writer); + } + } + public OPOIFSDocument(String name, int size, POIFSDocumentPath path, POIFSWriterListener writer) { + this(name, size, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, path, writer); + } + + /** + * @return array of SmallDocumentBlocks; may be empty, cannot be null + */ + public BlockWritable[] getSmallBlocks() { + return _small_store.getBlocks(); + } + + /** + * @return size of the document + */ + public int getSize() { + return _size; + } + + /** + * read data from the internal stores + * + * @param buffer the buffer to write to + * @param offset the offset into our storage to read from + * This method is currently (Oct 2008) only used by test code. Perhaps it can be deleted + */ + void read(byte[] buffer, int offset) { + int len = buffer.length; + + DataInputBlock currentBlock = getDataInputBlock(offset); + + int blockAvailable = currentBlock.available(); + if (blockAvailable > len) { + currentBlock.readFully(buffer, 0, len); + return; + } + // else read big amount in chunks + int remaining = len; + int writePos = 0; + int currentOffset = offset; + while (remaining > 0) { + boolean blockIsExpiring = remaining >= blockAvailable; + int reqSize; + if (blockIsExpiring) { + reqSize = blockAvailable; + } else { + reqSize = remaining; + } + currentBlock.readFully(buffer, writePos, reqSize); + remaining-=reqSize; + writePos+=reqSize; + currentOffset += reqSize; + if (blockIsExpiring) { + if (currentOffset == _size) { + if (remaining > 0) { + throw new IllegalStateException("reached end of document stream unexpectedly"); + } + currentBlock = null; + break; + } + currentBlock = getDataInputBlock(currentOffset); + blockAvailable = currentBlock.available(); + } + } + } + + /** + * @return null if offset points to the end of the document stream + */ + DataInputBlock getDataInputBlock(int offset) { + if (offset >= _size) { + if (offset > _size) { + throw new RuntimeException("Request for Offset " + offset + " doc size is " + _size); + } + return null; + } + if (_property.shouldUseSmallBlocks()) { + return SmallDocumentBlock.getDataInputBlock(_small_store.getBlocks(), offset); + } + return DocumentBlock.getDataInputBlock(_big_store.getBlocks(), offset); + } + + /** + * @return the instance's DocumentProperty + */ + + DocumentProperty getDocumentProperty() { + return _property; + } + + /* ********** START implementation of BlockWritable ********** */ + + /** + * Write the storage to an OutputStream + * + * @param stream the OutputStream to which the stored data should be written + */ + public void writeBlocks(OutputStream stream) throws IOException { + _big_store.writeBlocks(stream); + } + + /* ********** END implementation of BlockWritable ********** */ + /* ********** START implementation of BATManaged ********** */ + + /** + * Return the number of BigBlock's this instance uses + * + * @return count of BigBlock instances + */ + public int countBlocks() { + return _big_store.countBlocks(); + } + + /** + * Set the start block for this instance + * + * @param index index into the array of blocks making up the filesystem + */ + public void setStartBlock(int index) { + _property.setStartBlock(index); + } + + /* ********** END implementation of BATManaged ********** */ + /* ********** START begin implementation of POIFSViewable ********** */ + + /** + * Get an array of objects, some of which may implement POIFSViewable + * + * @return an array of Object; may not be null, but may be empty + */ + public Object[] getViewableArray() { + Object[] results = new Object[1]; + String result; + + try { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + BlockWritable[] blocks = null; + + if (_big_store.isValid()) { + blocks = _big_store.getBlocks(); + } else if (_small_store.isValid()) { + blocks = _small_store.getBlocks(); + } + if (blocks != null) { + for (int k = 0; k < blocks.length; k++) { + blocks[k].writeBlocks(output); + } + byte[] data = output.toByteArray(); + + if (data.length > _property.getSize()) { + byte[] tmp = new byte[_property.getSize()]; + + System.arraycopy(data, 0, tmp, 0, tmp.length); + data = tmp; + } + output = new ByteArrayOutputStream(); + HexDump.dump(data, 0, output, 0); + result = output.toString(); + } else { + result = ""; + } + } catch (IOException e) { + result = e.getMessage(); + } + results[0] = result; + return results; + } + + /** + * Get an Iterator of objects, some of which may implement POIFSViewable + * + * @return an Iterator; may not be null, but may have an empty back end + * store + */ + public Iterator getViewableIterator() { + return Collections.emptyList().iterator(); + } + + /** + * Give viewers a hint as to whether to call getViewableArray or + * getViewableIterator + * + * @return true if a viewer should call getViewableArray, + * false if a viewer should call getViewableIterator + */ + public boolean preferArray() { + return true; + } + + /** + * Provides a short description of the object, to be used when a + * POIFSViewable object has not provided its contents. + * + * @return short description + */ + public String getShortDescription() { + StringBuffer buffer = new StringBuffer(); + + buffer.append("Document: \"").append(_property.getName()).append("\""); + buffer.append(" size = ").append(getSize()); + return buffer.toString(); + } + + /* ********** END begin implementation of POIFSViewable ********** */ + private static final class SmallBlockStore { + private SmallDocumentBlock[] _smallBlocks; + private final POIFSDocumentPath _path; + private final String _name; + private final int _size; + private final POIFSWriterListener _writer; + private final POIFSBigBlockSize _bigBlockSize; + + /** + * Constructor + * + * @param blocks blocks to construct the store from + */ + SmallBlockStore(POIFSBigBlockSize bigBlockSize, SmallDocumentBlock[] blocks) { + _bigBlockSize = bigBlockSize; + _smallBlocks = blocks.clone(); + this._path = null; + this._name = null; + this._size = -1; + this._writer = null; + } + + /** + * Constructor for a small block store that will be written later + * + * @param path path of the document + * @param name name of the document + * @param size length of the document + * @param writer the object that will eventually write the document + */ + SmallBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, + String name, int size, POIFSWriterListener writer) { + _bigBlockSize = bigBlockSize; + _smallBlocks = new SmallDocumentBlock[0]; + this._path = path; + this._name = name; + this._size = size; + this._writer = writer; + } + + /** + * @return true if this store is a valid source of data + */ + boolean isValid() { + return _smallBlocks.length > 0 || _writer != null; + } + + /** + * @return the SmallDocumentBlocks + */ + SmallDocumentBlock[] getBlocks() { + if (isValid() && _writer != null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + _smallBlocks = SmallDocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); + } + return _smallBlocks; + } + } // end private class SmallBlockStore + + private static final class BigBlockStore { + private DocumentBlock[] bigBlocks; + private final POIFSDocumentPath _path; + private final String _name; + private final int _size; + private final POIFSWriterListener _writer; + private final POIFSBigBlockSize _bigBlockSize; + + /** + * Constructor + * + * @param blocks the blocks making up the store + */ + BigBlockStore(POIFSBigBlockSize bigBlockSize, DocumentBlock[] blocks) { + _bigBlockSize = bigBlockSize; + bigBlocks = blocks.clone(); + _path = null; + _name = null; + _size = -1; + _writer = null; + } + + /** + * Constructor for a big block store that will be written later + * + * @param path path of the document + * @param name name of the document + * @param size length of the document + * @param writer the object that will eventually write the document + */ + BigBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, + String name, int size, POIFSWriterListener writer) { + _bigBlockSize = bigBlockSize; + bigBlocks = new DocumentBlock[0]; + _path = path; + _name = name; + _size = size; + _writer = writer; + } + + /** + * @return true if this store is a valid source of data + */ + boolean isValid() { + return bigBlocks.length > 0 || _writer != null; + } + + /** + * @return the DocumentBlocks + */ + DocumentBlock[] getBlocks() { + if (isValid() && _writer != null) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + bigBlocks = DocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); + } + return bigBlocks; + } + + /** + * write the blocks to a stream + * + * @param stream the stream to which the data is to be written + */ + void writeBlocks(OutputStream stream) throws IOException { + if (isValid()) { + if (_writer != null) { + DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); + + _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); + dstream.writeFiller(countBlocks() * _bigBlockSize.getBigBlockSize(), + DocumentBlock.getFillByte()); + } else { + for (int k = 0; k < bigBlocks.length; k++) { + bigBlocks[k].writeBlocks(stream); + } + } + } + } + + /** + * @return number of big blocks making up this document + */ + int countBlocks() { + + if (isValid()) { + if (_writer == null) { + return bigBlocks.length; + } + return (_size + _bigBlockSize.getBigBlockSize() - 1) + / _bigBlockSize.getBigBlockSize(); + } + return 0; + } + } // end private class BigBlockStore +} diff --git a/src/java/org/apache/poi/poifs/filesystem/OPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/OPOIFSFileSystem.java index b95c899196..d03c57942e 100644 --- a/src/java/org/apache/poi/poifs/filesystem/OPOIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/OPOIFSFileSystem.java @@ -445,7 +445,7 @@ public class OPOIFSFileSystem * @param document the POIFSDocument being added */ - void addDocument(final POIFSDocument document) + void addDocument(final OPOIFSDocument document) { _documents.add(document); _property_table.addProperty(document.getDocumentProperty()); @@ -508,21 +508,21 @@ public class OPOIFSFileSystem { int startBlock = property.getStartBlock(); int size = property.getSize(); - POIFSDocument document = null; + OPOIFSDocument document = null; if (property.shouldUseSmallBlocks()) { document = - new POIFSDocument(name, - small_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), - size); + new OPOIFSDocument(name, + small_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), + size); } else { document = - new POIFSDocument(name, - big_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), - size); + new OPOIFSDocument(name, + big_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), + size); } parent.createDocument(document); } diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java deleted file mode 100644 index c6b35fd880..0000000000 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSDocument.java +++ /dev/null @@ -1,568 +0,0 @@ -/* ==================================================================== - 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.filesystem; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import org.apache.poi.poifs.common.POIFSBigBlockSize; -import org.apache.poi.poifs.common.POIFSConstants; -import org.apache.poi.poifs.dev.POIFSViewable; -import org.apache.poi.poifs.property.DocumentProperty; -import org.apache.poi.poifs.property.Property; -import org.apache.poi.poifs.storage.BlockWritable; -import org.apache.poi.poifs.storage.DataInputBlock; -import org.apache.poi.poifs.storage.DocumentBlock; -import org.apache.poi.poifs.storage.ListManagedBlock; -import org.apache.poi.poifs.storage.RawDataBlock; -import org.apache.poi.poifs.storage.SmallDocumentBlock; -import org.apache.poi.util.HexDump; - -/** - * This class manages a document in the POIFS filesystem. - * - * @author Marc Johnson (mjohnson at apache dot org) - */ -public final class POIFSDocument implements BATManaged, BlockWritable, POIFSViewable { - private static final DocumentBlock[] EMPTY_BIG_BLOCK_ARRAY = { }; - private static final SmallDocumentBlock[] EMPTY_SMALL_BLOCK_ARRAY = { }; - private DocumentProperty _property; - private int _size; - - private final POIFSBigBlockSize _bigBigBlockSize; - - // one of these stores will be valid - private SmallBlockStore _small_store; - private BigBlockStore _big_store; - - /** - * Constructor from large blocks - * - * @param name the name of the POIFSDocument - * @param blocks the big blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - */ - public POIFSDocument(String name, RawDataBlock[] blocks, int length) throws IOException { - _size = length; - if(blocks.length == 0) { - _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; - } else { - _bigBigBlockSize = (blocks[0].getBigBlockSize() == POIFSConstants.SMALLER_BIG_BLOCK_SIZE ? - POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS : - POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS - ); - } - - _big_store = new BigBlockStore(_bigBigBlockSize, convertRawBlocksToBigBlocks(blocks)); - _property = new DocumentProperty(name, _size); - _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); - _property.setDocument(this); - } - - // TODO - awkward typing going on here - private static DocumentBlock[] convertRawBlocksToBigBlocks(ListManagedBlock[] blocks) throws IOException { - DocumentBlock[] result = new DocumentBlock[blocks.length]; - for (int i = 0; i < result.length; i++) { - result[i] = new DocumentBlock((RawDataBlock)blocks[i]); - } - return result; - } - private static SmallDocumentBlock[] convertRawBlocksToSmallBlocks(ListManagedBlock[] blocks) { - if (blocks instanceof SmallDocumentBlock[]) { - return (SmallDocumentBlock[]) blocks; - } - SmallDocumentBlock[] result = new SmallDocumentBlock[blocks.length]; - System.arraycopy(blocks, 0, result, 0, blocks.length); - return result; - } - - /** - * Constructor from small blocks - * - * @param name the name of the POIFSDocument - * @param blocks the small blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - */ - public POIFSDocument(String name, SmallDocumentBlock[] blocks, int length) { - _size = length; - - if(blocks.length == 0) { - _bigBigBlockSize = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; - } else { - _bigBigBlockSize = blocks[0].getBigBlockSize(); - } - - _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); - _property = new DocumentProperty(name, _size); - _small_store = new SmallBlockStore(_bigBigBlockSize, blocks); - _property.setDocument(this); - } - - /** - * Constructor from small blocks - * - * @param name the name of the POIFSDocument - * @param blocks the small blocks making up the POIFSDocument - * @param length the actual length of the POIFSDocument - */ - public POIFSDocument(String name, POIFSBigBlockSize bigBlockSize, ListManagedBlock[] blocks, int length) throws IOException { - _size = length; - _bigBigBlockSize = bigBlockSize; - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (Property.isSmall(_size)) { - _big_store = new BigBlockStore(bigBlockSize,EMPTY_BIG_BLOCK_ARRAY); - _small_store = new SmallBlockStore(bigBlockSize,convertRawBlocksToSmallBlocks(blocks)); - } else { - _big_store = new BigBlockStore(bigBlockSize,convertRawBlocksToBigBlocks(blocks)); - _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); - } - } - public POIFSDocument(String name, ListManagedBlock[] blocks, int length) throws IOException { - this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, blocks, length); - } - - /** - * Constructor - * - * @param name the name of the POIFSDocument - * @param stream the InputStream we read data from - */ - public POIFSDocument(String name, POIFSBigBlockSize bigBlockSize, InputStream stream) throws IOException { - List blocks = new ArrayList(); - - _size = 0; - _bigBigBlockSize = bigBlockSize; - while (true) { - DocumentBlock block = new DocumentBlock(stream, bigBlockSize); - int blockSize = block.size(); - - if (blockSize > 0) { - blocks.add(block); - _size += blockSize; - } - if (block.partiallyRead()) { - break; - } - } - DocumentBlock[] bigBlocks = blocks.toArray(new DocumentBlock[blocks.size()]); - - _big_store = new BigBlockStore(bigBlockSize,bigBlocks); - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (_property.shouldUseSmallBlocks()) { - _small_store = new SmallBlockStore(bigBlockSize,SmallDocumentBlock.convert(bigBlockSize,bigBlocks, _size)); - _big_store = new BigBlockStore(bigBlockSize,new DocumentBlock[0]); - } else { - _small_store = new SmallBlockStore(bigBlockSize,EMPTY_SMALL_BLOCK_ARRAY); - } - } - public POIFSDocument(String name, InputStream stream) throws IOException { - this(name, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, stream); - } - - /** - * Constructor - * - * @param name the name of the POIFSDocument - * @param size the length of the POIFSDocument - * @param path the path of the POIFSDocument - * @param writer the writer who will eventually write the document contents - */ - public POIFSDocument(String name, int size, POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, POIFSWriterListener writer) { - _size = size; - _bigBigBlockSize = bigBlockSize; - _property = new DocumentProperty(name, _size); - _property.setDocument(this); - if (_property.shouldUseSmallBlocks()) { - _small_store = new SmallBlockStore(_bigBigBlockSize, path, name, size, writer); - _big_store = new BigBlockStore(_bigBigBlockSize, EMPTY_BIG_BLOCK_ARRAY); - } else { - _small_store = new SmallBlockStore(_bigBigBlockSize, EMPTY_SMALL_BLOCK_ARRAY); - _big_store = new BigBlockStore(_bigBigBlockSize, path, name, size, writer); - } - } - public POIFSDocument(String name, int size, POIFSDocumentPath path, POIFSWriterListener writer) { - this(name, size, POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS, path, writer); - } - - /** - * @return array of SmallDocumentBlocks; may be empty, cannot be null - */ - public BlockWritable[] getSmallBlocks() { - return _small_store.getBlocks(); - } - - /** - * @return size of the document - */ - public int getSize() { - return _size; - } - - /** - * read data from the internal stores - * - * @param buffer the buffer to write to - * @param offset the offset into our storage to read from - * This method is currently (Oct 2008) only used by test code. Perhaps it can be deleted - */ - void read(byte[] buffer, int offset) { - int len = buffer.length; - - DataInputBlock currentBlock = getDataInputBlock(offset); - - int blockAvailable = currentBlock.available(); - if (blockAvailable > len) { - currentBlock.readFully(buffer, 0, len); - return; - } - // else read big amount in chunks - int remaining = len; - int writePos = 0; - int currentOffset = offset; - while (remaining > 0) { - boolean blockIsExpiring = remaining >= blockAvailable; - int reqSize; - if (blockIsExpiring) { - reqSize = blockAvailable; - } else { - reqSize = remaining; - } - currentBlock.readFully(buffer, writePos, reqSize); - remaining-=reqSize; - writePos+=reqSize; - currentOffset += reqSize; - if (blockIsExpiring) { - if (currentOffset == _size) { - if (remaining > 0) { - throw new IllegalStateException("reached end of document stream unexpectedly"); - } - currentBlock = null; - break; - } - currentBlock = getDataInputBlock(currentOffset); - blockAvailable = currentBlock.available(); - } - } - } - - /** - * @return null if offset points to the end of the document stream - */ - DataInputBlock getDataInputBlock(int offset) { - if (offset >= _size) { - if (offset > _size) { - throw new RuntimeException("Request for Offset " + offset + " doc size is " + _size); - } - return null; - } - if (_property.shouldUseSmallBlocks()) { - return SmallDocumentBlock.getDataInputBlock(_small_store.getBlocks(), offset); - } - return DocumentBlock.getDataInputBlock(_big_store.getBlocks(), offset); - } - - /** - * @return the instance's DocumentProperty - */ - - DocumentProperty getDocumentProperty() { - return _property; - } - - /* ********** START implementation of BlockWritable ********** */ - - /** - * Write the storage to an OutputStream - * - * @param stream the OutputStream to which the stored data should be written - */ - public void writeBlocks(OutputStream stream) throws IOException { - _big_store.writeBlocks(stream); - } - - /* ********** END implementation of BlockWritable ********** */ - /* ********** START implementation of BATManaged ********** */ - - /** - * Return the number of BigBlock's this instance uses - * - * @return count of BigBlock instances - */ - public int countBlocks() { - return _big_store.countBlocks(); - } - - /** - * Set the start block for this instance - * - * @param index index into the array of blocks making up the filesystem - */ - public void setStartBlock(int index) { - _property.setStartBlock(index); - } - - /* ********** END implementation of BATManaged ********** */ - /* ********** START begin implementation of POIFSViewable ********** */ - - /** - * Get an array of objects, some of which may implement POIFSViewable - * - * @return an array of Object; may not be null, but may be empty - */ - public Object[] getViewableArray() { - Object[] results = new Object[1]; - String result; - - try { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - BlockWritable[] blocks = null; - - if (_big_store.isValid()) { - blocks = _big_store.getBlocks(); - } else if (_small_store.isValid()) { - blocks = _small_store.getBlocks(); - } - if (blocks != null) { - for (int k = 0; k < blocks.length; k++) { - blocks[k].writeBlocks(output); - } - byte[] data = output.toByteArray(); - - if (data.length > _property.getSize()) { - byte[] tmp = new byte[_property.getSize()]; - - System.arraycopy(data, 0, tmp, 0, tmp.length); - data = tmp; - } - output = new ByteArrayOutputStream(); - HexDump.dump(data, 0, output, 0); - result = output.toString(); - } else { - result = ""; - } - } catch (IOException e) { - result = e.getMessage(); - } - results[0] = result; - return results; - } - - /** - * Get an Iterator of objects, some of which may implement POIFSViewable - * - * @return an Iterator; may not be null, but may have an empty back end - * store - */ - public Iterator getViewableIterator() { - return Collections.emptyList().iterator(); - } - - /** - * Give viewers a hint as to whether to call getViewableArray or - * getViewableIterator - * - * @return true if a viewer should call getViewableArray, - * false if a viewer should call getViewableIterator - */ - public boolean preferArray() { - return true; - } - - /** - * Provides a short description of the object, to be used when a - * POIFSViewable object has not provided its contents. - * - * @return short description - */ - public String getShortDescription() { - StringBuffer buffer = new StringBuffer(); - - buffer.append("Document: \"").append(_property.getName()).append("\""); - buffer.append(" size = ").append(getSize()); - return buffer.toString(); - } - - /* ********** END begin implementation of POIFSViewable ********** */ - private static final class SmallBlockStore { - private SmallDocumentBlock[] _smallBlocks; - private final POIFSDocumentPath _path; - private final String _name; - private final int _size; - private final POIFSWriterListener _writer; - private final POIFSBigBlockSize _bigBlockSize; - - /** - * Constructor - * - * @param blocks blocks to construct the store from - */ - SmallBlockStore(POIFSBigBlockSize bigBlockSize, SmallDocumentBlock[] blocks) { - _bigBlockSize = bigBlockSize; - _smallBlocks = blocks.clone(); - this._path = null; - this._name = null; - this._size = -1; - this._writer = null; - } - - /** - * Constructor for a small block store that will be written later - * - * @param path path of the document - * @param name name of the document - * @param size length of the document - * @param writer the object that will eventually write the document - */ - SmallBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, - String name, int size, POIFSWriterListener writer) { - _bigBlockSize = bigBlockSize; - _smallBlocks = new SmallDocumentBlock[0]; - this._path = path; - this._name = name; - this._size = size; - this._writer = writer; - } - - /** - * @return true if this store is a valid source of data - */ - boolean isValid() { - return _smallBlocks.length > 0 || _writer != null; - } - - /** - * @return the SmallDocumentBlocks - */ - SmallDocumentBlock[] getBlocks() { - if (isValid() && _writer != null) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); - DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); - - _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); - _smallBlocks = SmallDocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); - } - return _smallBlocks; - } - } // end private class SmallBlockStore - - private static final class BigBlockStore { - private DocumentBlock[] bigBlocks; - private final POIFSDocumentPath _path; - private final String _name; - private final int _size; - private final POIFSWriterListener _writer; - private final POIFSBigBlockSize _bigBlockSize; - - /** - * Constructor - * - * @param blocks the blocks making up the store - */ - BigBlockStore(POIFSBigBlockSize bigBlockSize, DocumentBlock[] blocks) { - _bigBlockSize = bigBlockSize; - bigBlocks = blocks.clone(); - _path = null; - _name = null; - _size = -1; - _writer = null; - } - - /** - * Constructor for a big block store that will be written later - * - * @param path path of the document - * @param name name of the document - * @param size length of the document - * @param writer the object that will eventually write the document - */ - BigBlockStore(POIFSBigBlockSize bigBlockSize, POIFSDocumentPath path, - String name, int size, POIFSWriterListener writer) { - _bigBlockSize = bigBlockSize; - bigBlocks = new DocumentBlock[0]; - _path = path; - _name = name; - _size = size; - _writer = writer; - } - - /** - * @return true if this store is a valid source of data - */ - boolean isValid() { - return bigBlocks.length > 0 || _writer != null; - } - - /** - * @return the DocumentBlocks - */ - DocumentBlock[] getBlocks() { - if (isValid() && _writer != null) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(_size); - DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); - - _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); - bigBlocks = DocumentBlock.convert(_bigBlockSize, stream.toByteArray(), _size); - } - return bigBlocks; - } - - /** - * write the blocks to a stream - * - * @param stream the stream to which the data is to be written - */ - void writeBlocks(OutputStream stream) throws IOException { - if (isValid()) { - if (_writer != null) { - DocumentOutputStream dstream = new DocumentOutputStream(stream, _size); - - _writer.processPOIFSWriterEvent(new POIFSWriterEvent(dstream, _path, _name, _size)); - dstream.writeFiller(countBlocks() * _bigBlockSize.getBigBlockSize(), - DocumentBlock.getFillByte()); - } else { - for (int k = 0; k < bigBlocks.length; k++) { - bigBlocks[k].writeBlocks(stream); - } - } - } - } - - /** - * @return number of big blocks making up this document - */ - int countBlocks() { - - if (isValid()) { - if (_writer == null) { - return bigBlocks.length; - } - return (_size + _bigBlockSize.getBigBlockSize() - 1) - / _bigBlockSize.getBigBlockSize(); - } - return 0; - } - } // end private class BigBlockStore -} diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java index c6223cf242..bf5ea3c589 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java @@ -447,7 +447,7 @@ public class POIFSFileSystem * @param document the POIFSDocument being added */ - void addDocument(final POIFSDocument document) + void addDocument(final OPOIFSDocument document) { _documents.add(document); _property_table.addProperty(document.getDocumentProperty()); @@ -510,21 +510,21 @@ public class POIFSFileSystem { int startBlock = property.getStartBlock(); int size = property.getSize(); - POIFSDocument document = null; + OPOIFSDocument document = null; if (property.shouldUseSmallBlocks()) { document = - new POIFSDocument(name, - small_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), - size); + new OPOIFSDocument(name, + small_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), + size); } else { document = - new POIFSDocument(name, - big_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), - size); + new OPOIFSDocument(name, + big_blocks.fetchBlocks(startBlock, headerPropertiesStartAt), + size); } parent.createDocument(document); } diff --git a/src/java/org/apache/poi/poifs/property/DocumentProperty.java b/src/java/org/apache/poi/poifs/property/DocumentProperty.java index 67c8b03073..3ba3c0889b 100644 --- a/src/java/org/apache/poi/poifs/property/DocumentProperty.java +++ b/src/java/org/apache/poi/poifs/property/DocumentProperty.java @@ -19,12 +19,10 @@ package org.apache.poi.poifs.property; -import org.apache.poi.poifs.filesystem.POIFSDocument; +import org.apache.poi.poifs.filesystem.OPOIFSDocument; /** * Trivial extension of Property for POIFSDocuments - * - * @author Marc Johnson (mjohnson at apache dot org) */ public class DocumentProperty @@ -32,7 +30,7 @@ public class DocumentProperty { // the POIFSDocument this property is associated with - private POIFSDocument _document; + private OPOIFSDocument _document; /** * Constructor @@ -72,7 +70,7 @@ public class DocumentProperty * @param doc the associated POIFSDocument */ - public void setDocument(POIFSDocument doc) + public void setDocument(OPOIFSDocument doc) { _document = doc; } @@ -83,7 +81,7 @@ public class DocumentProperty * @return the associated document */ - public POIFSDocument getDocument() + public OPOIFSDocument getDocument() { return _document; } diff --git a/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java b/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java index 2db7bf4c73..783518f153 100644 --- a/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java +++ b/src/java/org/apache/poi/poifs/storage/SmallBlockTableWriter.java @@ -22,7 +22,7 @@ package org.apache.poi.poifs.storage; 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.filesystem.POIFSDocument; +import org.apache.poi.poifs.filesystem.OPOIFSDocument; import org.apache.poi.poifs.property.RootProperty; import java.util.*; @@ -62,7 +62,7 @@ public class SmallBlockTableWriter while (iter.hasNext()) { - POIFSDocument doc = ( POIFSDocument ) iter.next(); + OPOIFSDocument doc = ( OPOIFSDocument ) iter.next(); BlockWritable[] blocks = doc.getSmallBlocks(); if (blocks.length != 0) diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 0bb1de24b4..6c2969a789 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -32,7 +32,6 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java index e216ed9a88..21494b39ba 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocument.java @@ -28,27 +28,25 @@ import org.apache.poi.poifs.storage.RawDataBlock; import org.apache.poi.poifs.storage.SmallDocumentBlock; /** - * Class to test POIFSDocument functionality - * - * @author Marc Johnson + * Class to test OPOIFSDocument functionality */ public final class TestDocument extends TestCase { /** * Integration test -- really about all we can do */ - public void testPOIFSDocument() throws IOException { + public void testOPOIFSDocument() throws IOException { // verify correct number of blocks get created for document // that is exact multituple of block size - POIFSDocument document; + OPOIFSDocument document; byte[] array = new byte[ 4096 ]; for (int j = 0; j < array.length; j++) { array[ j ] = ( byte ) j; } - document = new POIFSDocument("foo", new SlowInputStream(new ByteArrayInputStream(array))); + document = new OPOIFSDocument("foo", new SlowInputStream(new ByteArrayInputStream(array))); checkDocument(document, array); // verify correct number of blocks get created for document @@ -58,7 +56,7 @@ public final class TestDocument extends TestCase { { array[ j ] = ( byte ) j; } - document = new POIFSDocument("bar", new ByteArrayInputStream(array)); + document = new OPOIFSDocument("bar", new ByteArrayInputStream(array)); checkDocument(document, array); // verify correct number of blocks get created for document @@ -68,7 +66,7 @@ public final class TestDocument extends TestCase { { array[ j ] = ( byte ) j; } - document = new POIFSDocument("_bar", new ByteArrayInputStream(array)); + document = new OPOIFSDocument("_bar", new ByteArrayInputStream(array)); checkDocument(document, array); // verify correct number of blocks get created for document @@ -78,7 +76,7 @@ public final class TestDocument extends TestCase { { array[ j ] = ( byte ) j; } - document = new POIFSDocument("_bar2", + document = new OPOIFSDocument("_bar2", new ByteArrayInputStream(array)); checkDocument(document, array); @@ -88,7 +86,7 @@ public final class TestDocument extends TestCase { { array[ j ] = ( byte ) j; } - document = new POIFSDocument("foobar", + document = new OPOIFSDocument("foobar", new ByteArrayInputStream(array)); checkDocument(document, array); document.setStartBlock(0x12345678); // what a big file!! @@ -135,9 +133,9 @@ public final class TestDocument extends TestCase { } } - private static POIFSDocument makeCopy(POIFSDocument document, byte[] input, byte[] data) + private static OPOIFSDocument makeCopy(OPOIFSDocument document, byte[] input, byte[] data) throws IOException { - POIFSDocument copy = null; + OPOIFSDocument copy = null; if (input.length >= 4096) { @@ -156,12 +154,12 @@ public final class TestDocument extends TestCase { } blocks[ index++ ] = block; } - copy = new POIFSDocument("test" + input.length, blocks, + copy = new OPOIFSDocument("test" + input.length, blocks, input.length); } else { - copy = new POIFSDocument( + copy = new OPOIFSDocument( "test" + input.length, ( SmallDocumentBlock [] ) document.getSmallBlocks(), input.length); @@ -169,7 +167,7 @@ public final class TestDocument extends TestCase { return copy; } - private static void checkDocument(final POIFSDocument document, final byte[] input) + private static void checkDocument(final OPOIFSDocument document, final byte[] input) throws IOException { int big_blocks = 0; int small_blocks = 0; @@ -195,7 +193,7 @@ public final class TestDocument extends TestCase { } private static byte[] checkValues(int big_blocks, int small_blocks, int total_output, - POIFSDocument document, byte[] input) throws IOException { + OPOIFSDocument document, byte[] input) throws IOException { assertEquals(document, document.getDocumentProperty().getDocument()); int increment = ( int ) Math.sqrt(input.length); diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java index 6ba10f99c6..98b2b7a7d7 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java @@ -64,8 +64,8 @@ public final class TestDocumentInputStream extends TestCase { { rawBlocks[ j ] = new RawDataBlock(stream); } - POIFSDocument document = new POIFSDocument("Workbook", rawBlocks, - _workbook_size); + OPOIFSDocument document = new OPOIFSDocument("Workbook", rawBlocks, + _workbook_size); _workbook_o = new DocumentNode( document.getDocumentProperty(), diff --git a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java index 6101494a07..69d167793a 100644 --- a/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java +++ b/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentNode.java @@ -46,7 +46,7 @@ public final class TestDocumentNode extends TestCase { { rawBlocks[ j ] = new RawDataBlock(stream); } - POIFSDocument document = new POIFSDocument("document", rawBlocks, + OPOIFSDocument document = new OPOIFSDocument("document", rawBlocks, 2000); DocumentProperty property2 = document.getDocumentProperty(); DirectoryNode parent = new DirectoryNode(property1, (POIFSFileSystem)null, null); diff --git a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java index f10576a4aa..9bb4f6a166 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestSmallBlockTableWriter.java @@ -25,7 +25,7 @@ import java.util.List; import junit.framework.TestCase; import org.apache.poi.poifs.common.POIFSConstants; -import org.apache.poi.poifs.filesystem.POIFSDocument; +import org.apache.poi.poifs.filesystem.OPOIFSDocument; import org.apache.poi.poifs.property.PropertyTable; import org.apache.poi.poifs.property.RootProperty; @@ -37,43 +37,43 @@ import org.apache.poi.poifs.property.RootProperty; public final class TestSmallBlockTableWriter extends TestCase { public void testWritingConstructor() throws IOException { - List documents = new ArrayList(); + List documents = new ArrayList(); documents.add( - new POIFSDocument( + new OPOIFSDocument( "doc340", new ByteArrayInputStream(new byte[ 340 ]))); documents.add( - new POIFSDocument( + new OPOIFSDocument( "doc5000", new ByteArrayInputStream(new byte[ 5000 ]))); documents - .add(new POIFSDocument("doc0", + .add(new OPOIFSDocument("doc0", new ByteArrayInputStream(new byte[ 0 ]))); documents - .add(new POIFSDocument("doc1", + .add(new OPOIFSDocument("doc1", new ByteArrayInputStream(new byte[ 1 ]))); documents - .add(new POIFSDocument("doc2", + .add(new OPOIFSDocument("doc2", new ByteArrayInputStream(new byte[ 2 ]))); documents - .add(new POIFSDocument("doc3", + .add(new OPOIFSDocument("doc3", new ByteArrayInputStream(new byte[ 3 ]))); documents - .add(new POIFSDocument("doc4", + .add(new OPOIFSDocument("doc4", new ByteArrayInputStream(new byte[ 4 ]))); documents - .add(new POIFSDocument("doc5", + .add(new OPOIFSDocument("doc5", new ByteArrayInputStream(new byte[ 5 ]))); documents - .add(new POIFSDocument("doc6", + .add(new OPOIFSDocument("doc6", new ByteArrayInputStream(new byte[ 6 ]))); documents - .add(new POIFSDocument("doc7", + .add(new OPOIFSDocument("doc7", new ByteArrayInputStream(new byte[ 7 ]))); documents - .add(new POIFSDocument("doc8", + .add(new OPOIFSDocument("doc8", new ByteArrayInputStream(new byte[ 8 ]))); documents - .add(new POIFSDocument("doc9", + .add(new OPOIFSDocument("doc9", new ByteArrayInputStream(new byte[ 9 ]))); HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);