]> source.dussan.org Git - poi.git/commitdiff
HWPF in-place write support
authorNick Burch <nick@apache.org>
Thu, 11 Aug 2016 15:14:04 +0000 (15:14 +0000)
committerNick Burch <nick@apache.org>
Thu, 11 Aug 2016 15:14:04 +0000 (15:14 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1756001 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java

index fe22c03eff297018815e430ebb2d06791d8d45c2..0d653891767096d52d63e190d40c42b43cbb3611 100644 (file)
@@ -572,12 +572,27 @@ public final class HWPFDocument extends HWPFDocumentCore {
     }
 
     /**
-     * Warning - not currently implemented for HWPF!
+     * Write out the word file that is represented by this class, to the 
+     *  currently open {@link File}, via the writeable {@link POIFSFileSystem}
+     *  it was opened as. 
+     *  
+     * <p>This will fail (with an {@link IllegalStateException} if the
+     *  Document was opened read-only, opened from an {@link InputStream}
+     *   instead of a File, or if this is not the root document. For those cases, 
+     *   you must use {@link #write(OutputStream)} or {@link #write(File)} to 
+     *   write to a brand new document.
+     *         
+     * @since 3.15
      */
     @Override
     public void write() throws IOException {
-        // TODO Implement
-        throw new IllegalStateException("Coming soon!");
+        validateInPlaceWritePossible();
+        
+        // Update the Document+Properties streams in the file
+        write(directory.getFileSystem(), false);
+        
+        // Sync with the File on disk
+        directory.getFileSystem().writeFilesystem();
     }
     
     /**
@@ -912,22 +927,18 @@ public final class HWPFDocument extends HWPFDocumentCore {
             dataBuf = tempBuf;
         }
 
-        // create new document preserving order of entries
-        // TODO Check "copyOtherEntries" and tweak behaviour based on that
-        // TODO That's needed for in-place write
+        // Create a new document preserving order of entries / Update existing
         boolean docWritten = false;
         boolean dataWritten = false;
         boolean objectPoolWritten = false;
         boolean tableWritten = false;
         boolean propertiesWritten = false;
-        for ( Iterator<Entry> iter = directory.getEntries(); iter.hasNext(); )
-        {
-            Entry entry = iter.next();
+        for (Entry entry : directory) {
             if ( entry.getName().equals( STREAM_WORD_DOCUMENT ) )
             {
                 if ( !docWritten )
                 {
-                    pfs.createDocument( new ByteArrayInputStream( mainBuf ),
+                    pfs.createOrUpdateDocument( new ByteArrayInputStream( mainBuf ),
                             STREAM_WORD_DOCUMENT );
                     docWritten = true;
                 }
@@ -936,7 +947,11 @@ public final class HWPFDocument extends HWPFDocumentCore {
             {
                 if ( !objectPoolWritten )
                 {
-                    _objectPool.writeTo( pfs.getRoot() );
+                    if ( copyOtherEntries ) {
+                        _objectPool.writeTo( pfs.getRoot() );
+                    } else {
+                        // Object pool is already there, no need to change/copy
+                    }
                     objectPoolWritten = true;
                 }
             }
@@ -945,7 +960,7 @@ public final class HWPFDocument extends HWPFDocumentCore {
             {
                 if ( !tableWritten )
                 {
-                    pfs.createDocument( new ByteArrayInputStream( tableBuf ),
+                    pfs.createOrUpdateDocument( new ByteArrayInputStream( tableBuf ),
                             STREAM_TABLE_1 );
                     tableWritten = true;
                 }
@@ -965,29 +980,29 @@ public final class HWPFDocument extends HWPFDocumentCore {
             {
                 if ( !dataWritten )
                 {
-                    pfs.createDocument( new ByteArrayInputStream( dataBuf ),
+                    pfs.createOrUpdateDocument( new ByteArrayInputStream( dataBuf ),
                             STREAM_DATA );
                     dataWritten = true;
                 }
             }
-            else
+            else if ( copyOtherEntries )
             {
                 EntryUtils.copyNodeRecursively( entry, pfs.getRoot() );
             }
         }
 
         if ( !docWritten )
-            pfs.createDocument( new ByteArrayInputStream( mainBuf ),
+            pfs.createOrUpdateDocument( new ByteArrayInputStream( mainBuf ),
                     STREAM_WORD_DOCUMENT );
         if ( !tableWritten )
-            pfs.createDocument( new ByteArrayInputStream( tableBuf ),
+            pfs.createOrUpdateDocument( new ByteArrayInputStream( tableBuf ),
                     STREAM_TABLE_1 );
         if ( !propertiesWritten )
             writeProperties( pfs );
         if ( !dataWritten )
-            pfs.createDocument( new ByteArrayInputStream( dataBuf ),
+            pfs.createOrUpdateDocument( new ByteArrayInputStream( dataBuf ),
                     STREAM_DATA );
-        if ( !objectPoolWritten )
+        if ( !objectPoolWritten && copyOtherEntries )
             _objectPool.writeTo( pfs.getRoot() );
 
         this.directory = pfs.getRoot();