From 3a5825c43f6bb12668bbfd14ab2a330c4c46fa0d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 28 Apr 2014 09:22:58 +0000 Subject: [PATCH] Update the HPSF change properties example to use NPOIFS + in-place writes, and have NPOIFS give a helpful error if you try to in-place write on a read only open git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590577 13f79535-47bb-0310-9956-ffa450edef68 --- .../ModifyDocumentSummaryInformation.java | 22 +++++++------------ .../poifs/filesystem/NPOIFSFileSystem.java | 6 +++++ .../poi/poifs/nio/FileBackedDataSource.java | 4 ++++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java b/src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java index 66c1cbdb0..9c4bc2613 100644 --- a/src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java +++ b/src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java @@ -18,12 +18,8 @@ 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; /** *

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(); } } diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java index 3f60b4bda..7aea791b3 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java @@ -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(); } diff --git a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java index fc0009c95..a4353752f 100644 --- a/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java +++ b/src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java @@ -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 {