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
This commit is contained in:
Nick Burch 2014-04-28 09:22:58 +00:00
parent a57e1f1fa6
commit 3a5825c43f
3 changed files with 18 additions and 14 deletions

View File

@ -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;
/**
* <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();
}
}

View 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();
}

View 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 {