]> source.dussan.org Git - poi.git/commitdiff
HWPFDocument.write(File) support and tests #57919
authorNick Burch <nick@apache.org>
Tue, 26 Jul 2016 10:58:08 +0000 (10:58 +0000)
committerNick Burch <nick@apache.org>
Tue, 26 Jul 2016 10:58:08 +0000 (10:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1754108 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHWPFWrite.java [new file with mode: 0644]

index f9d53dcbda67a10dc0d38960304dea0227ff37c4..fe22c03eff297018815e430ebb2d06791d8d45c2 100644 (file)
@@ -571,20 +571,39 @@ public final class HWPFDocument extends HWPFDocumentCore {
         return _fields;
     }
 
+    /**
+     * Warning - not currently implemented for HWPF!
+     */
     @Override
     public void write() throws IOException {
+        // TODO Implement
         throw new IllegalStateException("Coming soon!");
     }
+    
+    /**
+     * Writes out the word file that is represented by an instance of this class.
+     * 
+     * If the {@link File} exists, it will be replaced, otherwise a new one 
+     * will be created
+     *
+     * @param newFile The File to write to.
+     * @throws IOException If there is an unexpected IOException from writing
+     *         to the File.
+     *         
+     * @since 3.15 beta 3
+     */
     @Override
     public void write(File newFile) throws IOException {
-        throw new IllegalStateException("Coming soon!");
+        NPOIFSFileSystem pfs = POIFSFileSystem.create(newFile);
+        write(pfs, true);
+        pfs.writeFilesystem();
     }
 
     /**
      * Writes out the word file that is represented by an instance of this class.
      * 
-     * If {@code stream} is a {@link java.io.FileOutputStream} on a networked drive
-     * or has a high cost/latency associated with each written byte,
+     * For better performance when writing to files, use {@link #write(File)}.
+     * If {@code stream} has a high cost/latency associated with each written byte,
      * consider wrapping the OutputStream in a {@link java.io.BufferedOutputStream}
      * to improve write performance.
      *
@@ -592,9 +611,12 @@ public final class HWPFDocument extends HWPFDocumentCore {
      * @throws IOException If there is an unexpected IOException from the passed
      *         in OutputStream.
      */
-    public void write(OutputStream out)
-            throws IOException
-            {
+    public void write(OutputStream out) throws IOException {
+        NPOIFSFileSystem pfs = new NPOIFSFileSystem();
+        write(pfs, true);
+        pfs.writeFilesystem( out );
+    }
+    private void write(NPOIFSFileSystem pfs, boolean copyOtherEntries) throws IOException {
         // initialize our streams for writing.
         HWPFFileSystem docSys = new HWPFFileSystem();
         HWPFOutputStream wordDocumentStream = docSys.getStream(STREAM_WORD_DOCUMENT);
@@ -891,7 +913,8 @@ public final class HWPFDocument extends HWPFDocumentCore {
         }
 
         // create new document preserving order of entries
-        NPOIFSFileSystem pfs = new NPOIFSFileSystem();
+        // TODO Check "copyOtherEntries" and tweak behaviour based on that
+        // TODO That's needed for in-place write
         boolean docWritten = false;
         boolean dataWritten = false;
         boolean objectPoolWritten = false;
@@ -967,7 +990,6 @@ public final class HWPFDocument extends HWPFDocumentCore {
         if ( !objectPoolWritten )
             _objectPool.writeTo( pfs.getRoot() );
 
-        pfs.writeFilesystem( out );
         this.directory = pfs.getRoot();
 
         /*
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHWPFWrite.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHWPFWrite.java
new file mode 100644 (file)
index 0000000..95d7919
--- /dev/null
@@ -0,0 +1,81 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hwpf.usermodel;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.HWPFTestCase;
+import org.apache.poi.hwpf.HWPFTestDataSamples;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.TempFile;
+
+/**
+ * Test various write situations
+ */
+public final class TestHWPFWrite extends HWPFTestCase {
+   /**
+    * Write to a stream
+    */
+   public void testWriteStream() throws Exception {
+      HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
+
+      Range r = doc.getRange();
+      assertEquals("I am a test document\r", r.getParagraph(0).text());
+      
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      doc.write(baos);
+      doc.close();
+      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+      
+      doc = new HWPFDocument(bais);
+      r = doc.getRange();
+      assertEquals("I am a test document\r", r.getParagraph(0).text());
+      doc.close();
+   }
+   
+   /**
+    * Write to a new file
+    */
+   public void testWriteNewFile() throws Exception {
+       HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
+
+       Range r = doc.getRange();
+       assertEquals("I am a test document\r", r.getParagraph(0).text());
+       
+       File file = TempFile.createTempFile("TestDocument", ".doc");
+       doc.write(file);
+       doc.close();
+
+       // Check reading from File and Stream
+       doc = new HWPFDocument(new FileInputStream(file));
+       r = doc.getRange();
+       assertEquals("I am a test document\r", r.getParagraph(0).text());
+       doc.close();
+       
+       doc = new HWPFDocument(new POIFSFileSystem(file));
+       r = doc.getRange();
+       assertEquals("I am a test document\r", r.getParagraph(0).text());
+       doc.close();
+    }
+   
+   // TODO In-place write positive and negative checks
+}