Browse Source

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
tags/REL_3_11_BETA1
Nick Burch 10 years ago
parent
commit
0eb4f7684c

+ 8
- 14
src/examples/src/org/apache/poi/hpsf/examples/ModifyDocumentSummaryInformation.java 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();
}
}

+ 6
- 0
src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java 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();
}


+ 4
- 0
src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java 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 {

Loading…
Cancel
Save