aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2014-04-25 22:40:51 +0000
committerNick Burch <nick@apache.org>2014-04-25 22:40:51 +0000
commit9d2023f2ace81bb70b101772206d351d818d8263 (patch)
tree433569ad38c3398c508ce41eb2bb16d334a03a7e
parent99a52e7638628dc34014a321fce97e7b21bb4860 (diff)
downloadpoi-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.java71
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