diff options
author | Nick Burch <nick@apache.org> | 2014-04-25 22:40:51 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2014-04-25 22:40:51 +0000 |
commit | 9d2023f2ace81bb70b101772206d351d818d8263 (patch) | |
tree | 433569ad38c3398c508ce41eb2bb16d334a03a7e | |
parent | 99a52e7638628dc34014a321fce97e7b21bb4860 (diff) | |
download | poi-9d2023f2ace81bb70b101772206d351d818d8263.tar.gz poi-9d2023f2ace81bb70b101772206d351d818d8263.zip |
Support for replacing the contents of a Document in a NPOIFSFileSytem, in place
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590177 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java index 9ed99f4c44..0da6de87fd 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java @@ -46,6 +46,14 @@ public final class NPOIFSDocument implements POIFSViewable { /** * Constructor for an existing Document */ + public NPOIFSDocument(DocumentNode document) throws IOException { + this((DocumentProperty)document.getProperty(), + ((DirectoryNode)document.getParent()).getNFileSystem()); + } + + /** + * Constructor for an existing Document + */ public NPOIFSDocument(DocumentProperty property, NPOIFSFileSystem filesystem) throws IOException { @@ -72,32 +80,10 @@ public final class NPOIFSDocument implements POIFSViewable { { this._filesystem = filesystem; - final int bigBlockSize = POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE; - BufferedInputStream bis = new BufferedInputStream(stream, bigBlockSize+1); - bis.mark(bigBlockSize); - - // Do we need to store as a mini stream or a full one? - if(bis.skip(bigBlockSize) < bigBlockSize) { - _stream = new NPOIFSStream(filesystem.getMiniStore()); - _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); - } else { - _stream = new NPOIFSStream(filesystem); - _block_size = _filesystem.getBlockStoreBlockSize(); - } - - // start from the beginning - bis.reset(); - // Store it - OutputStream os = _stream.getOutputStream(); - byte buf[] = new byte[1024]; - int length = 0; - - for (int readBytes; (readBytes = bis.read(buf)) != -1; length += readBytes) { - os.write(buf, 0, readBytes); - } + int length = store(stream); - // And build the property for it + // Build the property for it this._property = new DocumentProperty(name, length); _property.setStartBlock(_stream.getStartBlock()); } @@ -129,6 +115,38 @@ public final class NPOIFSDocument implements POIFSViewable { } /** + * Stores the given data for this Document + */ + private int store(InputStream stream) throws IOException { + final int bigBlockSize = POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE; + BufferedInputStream bis = new BufferedInputStream(stream, bigBlockSize+1); + bis.mark(bigBlockSize); + + // Do we need to store as a mini stream or a full one? + if(bis.skip(bigBlockSize) < bigBlockSize) { + _stream = new NPOIFSStream(_filesystem.getMiniStore()); + _block_size = _filesystem.getMiniStore().getBlockStoreBlockSize(); + } else { + _stream = new NPOIFSStream(_filesystem); + _block_size = _filesystem.getBlockStoreBlockSize(); + } + + // start from the beginning + bis.reset(); + + // Store it + OutputStream os = _stream.getOutputStream(); + byte buf[] = new byte[1024]; + int length = 0; + + for (int readBytes; (readBytes = bis.read(buf)) != -1; length += readBytes) { + os.write(buf, 0, readBytes); + } + + return length; + } + + /** * Frees the underlying stream and property */ void free() throws IOException { @@ -155,6 +173,11 @@ public final class NPOIFSDocument implements POIFSViewable { public int getSize() { return _property.getSize(); } + + public void replaceContents(InputStream stream) throws IOException { + free(); + store(stream); + } /** * @return the instance's DocumentProperty |