]> source.dussan.org Git - poi.git/commitdiff
Support for replacing the contents of a Document in a NPOIFSFileSytem, in place
authorNick Burch <nick@apache.org>
Fri, 25 Apr 2014 22:40:51 +0000 (22:40 +0000)
committerNick Burch <nick@apache.org>
Fri, 25 Apr 2014 22:40:51 +0000 (22:40 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590177 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java

index 9ed99f4c44c072842a69c9eab512e8ce78e8077a..0da6de87fd89281af30f6f72a428b99ffdec445d 100644 (file)
@@ -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