]> source.dussan.org Git - poi.git/commitdiff
Update the HPSF change properties example to use NPOIFS + in-place writes, and have...
authorNick Burch <nick@apache.org>
Mon, 28 Apr 2014 09:22:58 +0000 (09:22 +0000)
committerNick Burch <nick@apache.org>
Mon, 28 Apr 2014 09:22:58 +0000 (09:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590577 13f79535-47bb-0310-9956-ffa450edef68

src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java
src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java
src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java

index 66c1cbdb0eae2b3208578230bb7ff791622fa0d0..9c4bc261358a1068933cabcced6b0d020a4d4dcb 100644 (file)
 package org.apache.poi.hpsf.examples;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.util.Date;
 
 import org.apache.poi.hpsf.CustomProperties;
@@ -38,7 +34,7 @@ import org.apache.poi.hpsf.WritingNotSupportedException;
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 
 /**
  * <p>This is a sample application showing how to easily modify properties in
@@ -99,12 +95,10 @@ public class ModifyDocumentSummaryInformation {
         /* Read the name of the POI filesystem to modify from the command line.
          * For brevity to boundary check is performed on the command-line
          * arguments. */
-        File poiFilesystem = new File(args[0]);
+        File summaryFile = new File(args[0]);
 
         /* Open the POI filesystem. */
-        InputStream is = new FileInputStream(poiFilesystem);
-        POIFSFileSystem poifs = new POIFSFileSystem(is);
-        is.close();
+        NPOIFSFileSystem poifs = new NPOIFSFileSystem(summaryFile, false);
 
         /* Read the summary information. */
         DirectoryEntry dir = poifs.getRoot();
@@ -174,6 +168,7 @@ public class ModifyDocumentSummaryInformation {
 
         /* Read a custom property. */
         Object value = customProperties.get("Sample Number");
+        System.out.println("Custom Sample Number is now " + value);
 
         /* Write the custom properties back to the document summary
          * information. */
@@ -185,10 +180,9 @@ public class ModifyDocumentSummaryInformation {
         dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
 
         /* Write the POI filesystem back to the original file. Please note that
-         * in production code you should never write directly to the origin
-         * file! In case of a writing error everything would be lost. */
-        OutputStream out = new FileOutputStream(poiFilesystem);
-        poifs.writeFilesystem(out);
-        out.close();
+         * in production code you should take care when write directly to the 
+         * origin, to make sure you don't loose things on error */
+        poifs.writeFilesystem();
+        poifs.close();
     }
 }
index 3f60b4bda2453a8561429098c0891d88962d0536..7aea791b3b4ad5075b4fd6e6137b0f82057f5c46 100644 (file)
@@ -693,6 +693,12 @@ public class NPOIFSFileSystem extends BlockStore
                 "not be called. Use writeFilesystem(OutputStream) instead"
           );
        }
+       if (! ((FileBackedDataSource)_data).isWriteable()) {
+           throw new IllegalArgumentException(
+                "POIFS opened in read only mode, so writeFilesystem() may " +
+                "not be called. Open the FileSystem in read-write mode first"
+           );
+       }
        syncWithDataSource();
     }
 
index fc0009c953fb5bfb6b7263ac82aff340f32de488..a4353752fee239c845186ee35aa5ee85d9f830fc 100644 (file)
@@ -49,6 +49,10 @@ public class FileBackedDataSource extends DataSource {
       this.channel = channel;
       this.writable = !readOnly;
    }
+   
+   public boolean isWriteable() {
+       return this.writable;
+   }
 
    @Override
    public ByteBuffer read(int length, long position) throws IOException {