You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2016/07/21 23:09:07 UTC

svn commit: r1753739 - in /poi/trunk/src/java/org/apache/poi: POIDocument.java hssf/usermodel/HSSFWorkbook.java poifs/filesystem/DirectoryNode.java poifs/filesystem/NPOIFSFileSystem.java

Author: nick
Date: Thu Jul 21 23:09:07 2016
New Revision: 1753739

URL: http://svn.apache.org/viewvc?rev=1753739&view=rev
Log:
Provide a createOrUpdateDocument method at the POIFS level, and use to simplify writing code #57919

Modified:
    poi/trunk/src/java/org/apache/poi/POIDocument.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
    poi/trunk/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java
    poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java

Modified: poi/trunk/src/java/org/apache/poi/POIDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/POIDocument.java?rev=1753739&r1=1753738&r2=1753739&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/POIDocument.java (original)
+++ poi/trunk/src/java/org/apache/poi/POIDocument.java Thu Jul 21 23:09:07 2016
@@ -21,7 +21,6 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -35,8 +34,6 @@ import org.apache.poi.hpsf.SummaryInform
 import org.apache.poi.poifs.crypt.EncryptionInfo;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.poifs.filesystem.DocumentNode;
-import org.apache.poi.poifs.filesystem.NPOIFSDocument;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.OPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@@ -239,14 +236,13 @@ public abstract class POIDocument implem
     /**
      * Writes out the updated standard Document Information Properties (HPSF)
      *  into the currently open NPOIFSFileSystem
-     * TODO Implement in-place update
      * 
      * @throws IOException if an error when writing to the open
      *      {@link NPOIFSFileSystem} occurs
-     * TODO throws exception if open from stream not file
      */
     protected void writeProperties() throws IOException {
-        throw new IllegalStateException("In-place write is not yet supported");
+        validateInPlaceWritePossible();
+        writeProperties(directory.getFileSystem(), null);
     }
 
     /**
@@ -301,16 +297,9 @@ public abstract class POIDocument implem
             mSet.write(bOut);
             byte[] data = bOut.toByteArray();
             ByteArrayInputStream bIn = new ByteArrayInputStream(data);
-            
-            // New or Existing?
-            // TODO Use a createOrUpdate method for this to be cleaner!
-            try {
-                DocumentNode propSetNode = (DocumentNode)outFS.getRoot().getEntry(name);
-                NPOIFSDocument propSetDoc = new NPOIFSDocument(propSetNode);
-                propSetDoc.replaceContents(bIn);
-            } catch (FileNotFoundException e) {
-                outFS.createDocument(bIn,name);
-            }
+
+            // Create or Update the Property Set stream in the POIFS
+            outFS.createOrUpdateDocument(bIn, name);
 
             logger.log(POILogger.INFO, "Wrote property set " + name + " of size " + data.length);
         } catch(org.apache.poi.hpsf.WritingNotSupportedException wnse) {
@@ -351,6 +340,7 @@ public abstract class POIDocument implem
      * @since POI 3.15 beta 3
      * 
      * @throws IOException thrown on errors writing to the file
+     * @throws IllegalStateException if this isn't from a writable File
      */
     public abstract void write() throws IOException;
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=1753739&r1=1753738&r2=1753739&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Thu Jul 21 23:09:07 2016
@@ -1312,7 +1312,7 @@ public final class HSSFWorkbook extends
         workbookDoc.replaceContents(new ByteArrayInputStream(getBytes()));
         
         // Update the properties streams in the file
-        writeProperties(directory.getFileSystem(), null);
+        writeProperties();
         
         // Sync with the File on disk
         directory.getFileSystem().writeFilesystem();

Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java?rev=1753739&r1=1753738&r2=1753739&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/DirectoryNode.java Thu Jul 21 23:09:07 2016
@@ -479,6 +479,38 @@ public class DirectoryNode
     }
 
     /**
+     * Set the contents of a document, creating if needed, 
+     *  otherwise updating. Returns the created / updated DocumentEntry
+     *
+     * @param name the name of the new or existing DocumentEntry
+     * @param stream the InputStream from which to populate the DocumentEntry
+     *
+     * @return the new or updated DocumentEntry
+     *
+     * @exception IOException
+     */
+
+    public DocumentEntry createOrUpdateDocument(final String name,
+                                                final InputStream stream)
+        throws IOException
+    {
+        if (! hasEntry(name)) {
+            return createDocument(name, stream);
+        } else {
+            DocumentNode existing = (DocumentNode)getEntry(name);
+            if (_nfilesystem != null) {
+                NPOIFSDocument nDoc = new NPOIFSDocument(existing);
+                nDoc.replaceContents(stream);
+                return existing;
+            } else {
+                // Do it the hard way for Old POIFS...
+                deleteEntry(existing);
+                return createDocument(name, stream);
+            }
+        }
+    }
+    
+    /**
      * Gets the storage clsid of the directory entry
      *
      * @return storage Class ID

Modified: poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java?rev=1753739&r1=1753738&r2=1753739&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java (original)
+++ poi/trunk/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java Thu Jul 21 23:09:07 2016
@@ -689,8 +689,6 @@ public class NPOIFSFileSystem extends Bl
         return getRoot().createDocument(name, stream);
     }
 
-    // TODO Add a createOrUpdateDocument method to simplify code
-    
     /**
      * create a new DocumentEntry in the root entry; the data will be
      * provided later
@@ -728,6 +726,26 @@ public class NPOIFSFileSystem extends Bl
     }
     
     /**
+     * Set the contents of a document in the root directory,
+     *  creating if needed, otherwise updating
+     *
+     * @param stream the InputStream from which the document's data
+     *               will be obtained
+     * @param name the name of the new or existing POIFSDocument
+     *
+     * @return the new or updated DocumentEntry
+     *
+     * @exception IOException on error populating the POIFSDocument
+     */
+
+    public DocumentEntry createOrUpdateDocument(final InputStream stream,
+                                                final String name)
+        throws IOException
+    {
+        return getRoot().createOrUpdateDocument(name, stream);
+    }
+    
+    /**
      * Does the filesystem support an in-place write via
      *  {@link #writeFilesystem()} ? If false, only writing out to
      *  a brand new file via {@link #writeFilesystem(OutputStream)}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org