mirror of https://github.com/apache/poi.git
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
This commit is contained in:
parent
99a52e7638
commit
9d2023f2ac
|
@ -43,6 +43,14 @@ public final class NPOIFSDocument implements POIFSViewable {
|
|||
private NPOIFSStream _stream;
|
||||
private int _block_size;
|
||||
|
||||
/**
|
||||
* Constructor for an existing Document
|
||||
*/
|
||||
public NPOIFSDocument(DocumentNode document) throws IOException {
|
||||
this((DocumentProperty)document.getProperty(),
|
||||
((DirectoryNode)document.getParent()).getNFileSystem());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for an existing Document
|
||||
*/
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -128,6 +114,38 @@ public final class NPOIFSDocument implements POIFSViewable {
|
|||
_property.setStartBlock(_stream.getStartBlock());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue