diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java index 223e6036e..1adfcff06 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java @@ -545,18 +545,53 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable { @Override public void write() throws IOException { - throw new IllegalStateException("Coming soon!"); + throw new IllegalStateException("In-Place write coming soon! See Bug #57919"); } + + /** + * Writes out the slideshow file the is represented by an instance + * of this class. + *

This will write out only the common OLE2 streams. If you require all + * streams to be written out, use {@link #write(File, boolean)} + * with preserveNodes set to true. + * @param newFile The File to write to. + * @throws IOException If there is an unexpected IOException from writing to the File + */ @Override public void write(File newFile) throws IOException { - throw new IllegalStateException("Coming soon!"); + // Write out, but only the common streams + write(newFile, false); + } + /** + * Writes out the slideshow file the is represented by an instance + * of this class. + * If you require all streams to be written out (eg Marcos, embeded + * documents), then set preserveNodes set to true + * @param newFile The File to write to. + * @param preserveNodes Should all OLE2 streams be written back out, or only the common ones? + * @throws IOException If there is an unexpected IOException from writing to the File + */ + public void write(File newFile, boolean preserveNodes) throws IOException { + // Get a new FileSystem to write into + POIFSFileSystem outFS = POIFSFileSystem.create(newFile); + + try { + // Write into the new FileSystem + write(outFS, preserveNodes); + + // Send the POIFSFileSystem object out to the underlying stream + outFS.writeFilesystem(); + } finally { + outFS.close(); + } } /** * Writes out the slideshow file the is represented by an instance * of this class. - * It will write out the common OLE2 streams. If you require all - * streams to be written out, pass in preserveNodes + *

This will write out only the common OLE2 streams. If you require all + * streams to be written out, use {@link #write(OutputStream, boolean)} + * with preserveNodes set to true. * @param out The OutputStream to write to. * @throws IOException If there is an unexpected IOException from * the passed in OutputStream @@ -570,7 +605,7 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable { * Writes out the slideshow file the is represented by an instance * of this class. * If you require all streams to be written out (eg Marcos, embeded - * documents), then set preserveNodes to true + * documents), then set preserveNodes set to true * @param out The OutputStream to write to. * @param preserveNodes Should all OLE2 streams be written back out, or only the common ones? * @throws IOException If there is an unexpected IOException from diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java index 10e622570..06bfd1798 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import org.apache.poi.POIDataSamples; @@ -31,6 +32,7 @@ import org.apache.poi.hslf.usermodel.HSLFSlideShow; import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.util.TempFile; import org.junit.Before; import org.junit.Test; @@ -72,31 +74,38 @@ public final class TestReWrite { } public void assertWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception { - // Write out to a byte array + // Write out to a byte array, and to a temp file ByteArrayOutputStream baos = new ByteArrayOutputStream(); hss.write(baos); + + final File file = TempFile.createTempFile("TestHSLF", ".ppt"); + hss.write(file); + - // Build an input stream of it + // Build an input stream of it, and read back as a POIFS from the stream ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - - // Use POIFS to query that lot - POIFSFileSystem npfs = new POIFSFileSystem(bais); - - // Check that the "PowerPoint Document" sections have the same size - DocumentEntry oProps = (DocumentEntry)pfs.getRoot().getEntry("PowerPoint Document"); - DocumentEntry nProps = (DocumentEntry)npfs.getRoot().getEntry("PowerPoint Document"); - assertEquals(oProps.getSize(),nProps.getSize()); - - // Check that they contain the same data - byte[] _oData = new byte[oProps.getSize()]; - byte[] _nData = new byte[nProps.getSize()]; - pfs.createDocumentInputStream("PowerPoint Document").read(_oData); - npfs.createDocumentInputStream("PowerPoint Document").read(_nData); - for(int i=0; i<_oData.length; i++) { - //System.out.println(i + "\t" + Integer.toHexString(i)); - assertEquals(_oData[i], _nData[i]); + POIFSFileSystem npfS = new POIFSFileSystem(bais); + + // And the same on the temp file + POIFSFileSystem npfF = new POIFSFileSystem(file); + + for (POIFSFileSystem npf : new POIFSFileSystem[] { npfS, npfF }) { + // Check that the "PowerPoint Document" sections have the same size + DocumentEntry oProps = (DocumentEntry)pfs.getRoot().getEntry("PowerPoint Document"); + DocumentEntry nProps = (DocumentEntry)npf.getRoot().getEntry("PowerPoint Document"); + assertEquals(oProps.getSize(),nProps.getSize()); + + // Check that they contain the same data + byte[] _oData = new byte[oProps.getSize()]; + byte[] _nData = new byte[nProps.getSize()]; + pfs.createDocumentInputStream("PowerPoint Document").read(_oData); + npf.createDocumentInputStream("PowerPoint Document").read(_nData); + for(int i=0; i<_oData.length; i++) { + //System.out.println(i + "\t" + Integer.toHexString(i)); + assertEquals(_oData[i], _nData[i]); + } + npf.close(); } - npfs.close(); } @Test