--- /dev/null
+/* ====================================================================
+ Copyright 2002-2004 Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.apache.poi.hpsf.DocumentSummaryInformation;
+import org.apache.poi.hpsf.MutablePropertySet;
+import org.apache.poi.hpsf.PropertySet;
+import org.apache.poi.hpsf.PropertySetFactory;
+import org.apache.poi.hpsf.SummaryInformation;
+import org.apache.poi.poifs.filesystem.DocumentInputStream;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+
+/**
+ * This holds the common functionality for all POI
+ * Document classes.
+ * Currently, this relates to Document Information Properties
+ *
+ * @author Nick Burch
+ */
+public abstract class POIDocument {
+ // Holds metadata on our document
+ protected SummaryInformation sInf;
+ protected DocumentSummaryInformation dsInf;
+
+ protected POIFSFileSystem filesystem;
+
+ /**
+ * Fetch the Document Summary Information of the document
+ */
+ public DocumentSummaryInformation getDocumentSummaryInformation() { return dsInf; }
+
+ /**
+ * Fetch the Summary Information of the document
+ */
+ public SummaryInformation getSummaryInformation() { return sInf; }
+
+ /**
+ * Find, and create objects for, the standard
+ * Documment Information Properties (hpsf)
+ */
+ protected void readProperties() {
+ // DocumentSummaryInformation
+ dsInf = (DocumentSummaryInformation)getPropertySet("\005DocumentSummaryInformation");
+
+ // SummaryInformation
+ sInf = (SummaryInformation)getPropertySet("\005SummaryInformation");
+ }
+
+ /**
+ * For a given named property entry, either return it or null if
+ * if it wasn't found
+ */
+ protected PropertySet getPropertySet(String setName) {
+ DocumentInputStream dis;
+ try {
+ // Find the entry, and get an input stream for it
+ dis = filesystem.createDocumentInputStream(setName);
+ } catch(IOException ie) {
+ // Oh well, doesn't exist
+ System.err.println("Error getting property set with name " + setName + "\n" + ie);
+ return null;
+ }
+
+ try {
+ // Create the Property Set
+ PropertySet set = PropertySetFactory.create(dis);
+ return set;
+ } catch(IOException ie) {
+ // Must be corrupt or something like that
+ System.err.println("Error creating property set with name " + setName + "\n" + ie);
+ } catch(org.apache.poi.hpsf.HPSFException he) {
+ // Oh well, doesn't exist
+ System.err.println("Error creating property set with name " + setName + "\n" + he);
+ }
+ return null;
+ }
+
+ /**
+ * Writes out the standard Documment Information Properties (hpsf)
+ * @param outFS the POIFSFileSystem to write the properties into
+ */
+ protected void writeProperties(POIFSFileSystem outFS) throws IOException {
+ if(sInf != null) {
+ writePropertySet("\005SummaryInformation",sInf,outFS);
+ }
+ if(dsInf != null) {
+ writePropertySet("\005DocumentSummaryInformation",dsInf,outFS);
+ }
+ }
+
+ /**
+ * Writes out a given ProperySet
+ * @param name the (POIFS Level) name of the property to write
+ * @param set the PropertySet to write out
+ * @param outFS the POIFSFileSystem to write the property into
+ */
+ protected void writePropertySet(String name, PropertySet set, POIFSFileSystem outFS) throws IOException {
+ try {
+ MutablePropertySet mSet = new MutablePropertySet(set);
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ mSet.write(bOut);
+ byte[] data = bOut.toByteArray();
+ ByteArrayInputStream bIn = new ByteArrayInputStream(data);
+ outFS.createDocument(bIn,name);
+ System.out.println("Wrote property set " + name + " of size " + data.length);
+ } catch(org.apache.poi.hpsf.WritingNotSupportedException wnse) {
+ System.err.println("Couldn't write property set with name " + name + " as not supported by HPSF yet");
+ }
+ }
+}
import java.util.*;
import java.io.*;
+import org.apache.poi.POIDocument;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
* @author Nick Burch
*/
-public class HSLFSlideShow
+public class HSLFSlideShow extends POIDocument
{
private InputStream istream;
- private POIFSFileSystem filesystem;
- // Holds metadata on our document
- private SummaryInformation sInf;
- private DocumentSummaryInformation dsInf;
+ // Holds metadata on where things are in our document
private CurrentUserAtom currentUser;
// Low level contents of the file
// Look for Property Streams:
readProperties();
+
+ // Look for other streams
+ readOtherStreams();
// Look for Picture Streams:
readPictures();
/**
- * Find the properties from the filesystem, and load them
+ * Find the other from the filesystem (currently just CurrentUserAtom),
+ * and load them
*/
- public void readProperties() {
- // DocumentSummaryInformation
- dsInf = (DocumentSummaryInformation)getPropertySet("\005DocumentSummaryInformation");
-
- // SummaryInformation
- sInf = (SummaryInformation)getPropertySet("\005SummaryInformation");
-
+ public void readOtherStreams() {
// Current User
try {
currentUser = new CurrentUserAtom(filesystem);
}
- /**
- * For a given named property entry, either return it or null if
- * if it wasn't found
- */
- public PropertySet getPropertySet(String setName) {
- DocumentInputStream dis;
- try {
- // Find the entry, and get an input stream for it
- dis = filesystem.createDocumentInputStream(setName);
- } catch(IOException ie) {
- // Oh well, doesn't exist
- System.err.println("Error getting property set with name " + setName + "\n" + ie);
- return null;
- }
-
- try {
- // Create the Property Set
- PropertySet set = PropertySetFactory.create(dis);
- return set;
- } catch(IOException ie) {
- // Must be corrupt or something like that
- System.err.println("Error creating property set with name " + setName + "\n" + ie);
- } catch(org.apache.poi.hpsf.HPSFException he) {
- // Oh well, doesn't exist
- System.err.println("Error creating property set with name " + setName + "\n" + he);
- }
- return null;
- }
-
-
/**
* Writes out the slideshow file the is represented by an instance of
* this class
POIFSFileSystem outFS = new POIFSFileSystem();
// Write out the Property Streams
- if(sInf != null) {
- writePropertySet("\005SummaryInformation",sInf,outFS);
- }
- if(dsInf != null) {
- writePropertySet("\005DocumentSummaryInformation",dsInf,outFS);
- }
+ writeProperties(outFS);
// For position dependent records, hold where they were and now are
}
- /**
- * Writes out a given ProperySet
- */
- private void writePropertySet(String name, PropertySet set, POIFSFileSystem fs) throws IOException {
- try {
- MutablePropertySet mSet = new MutablePropertySet(set);
- ByteArrayOutputStream bOut = new ByteArrayOutputStream();
- mSet.write(bOut);
- byte[] data = bOut.toByteArray();
- ByteArrayInputStream bIn = new ByteArrayInputStream(data);
- fs.createDocument(bIn,name);
- System.out.println("Wrote property set " + name + " of size " + data.length);
- } catch(org.apache.poi.hpsf.WritingNotSupportedException wnse) {
- System.err.println("Couldn't write property set with name " + name + " as not supported by HPSF yet");
- }
- }
-
-
/* ******************* adding methods follow ********************* */
/**
*/
public byte[] getUnderlyingBytes() { return _docstream; }
- /**
- * Fetch the Document Summary Information of the document
- */
- public DocumentSummaryInformation getDocumentSummaryInformation() { return dsInf; }
-
- /**
- * Fetch the Summary Information of the document
- */
- public SummaryInformation getSummaryInformation() { return sInf; }
-
/**
* Fetch the Current User Atom of the document
*/
--- /dev/null
+
+/* ====================================================================
+ Copyright 2002-2004 Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+
+
+package org.apache.poi;
+
+
+import junit.framework.TestCase;
+import java.io.*;
+
+import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.poifs.filesystem.*;
+
+/**
+ * Tests that POIDocument correctly loads and saves the common
+ * (hspf) Document Properties
+ *
+ * @author Nick Burch (nick at torchbox dot com)
+ */
+public class TestPOIDocument extends TestCase {
+ // The POI Document to work on
+ private POIDocument doc;
+ // POIFS primed on the test (powerpoint) data
+ private POIFSFileSystem pfs;
+
+ /**
+ * Set things up, using a PowerPoint document for our testing
+ */
+ public void setUp() throws Exception {
+ String dirname = System.getProperty("HSLF.testdata.path");
+ String filename = dirname + "/basic_test_ppt_file.ppt";
+ FileInputStream fis = new FileInputStream(filename);
+ pfs = new POIFSFileSystem(fis);
+ doc = new HSLFSlideShow(pfs);
+ }
+
+ public void testReadProperties() throws Exception {
+ // We should have both sets
+ assertNotNull(doc.getDocumentSummaryInformation());
+ assertNotNull(doc.getSummaryInformation());
+
+ // Check they are as expected for the test doc
+ assertEquals("Hogwarts", doc.getSummaryInformation().getAuthor());
+ assertEquals(10598, doc.getDocumentSummaryInformation().getByteCount());
+ }
+
+ public void testWriteProperties() throws Exception {
+ // Just check we can write them back out into a filesystem
+ POIFSFileSystem outFS = new POIFSFileSystem();
+ doc.writeProperties(outFS);
+
+ // Should now hold them
+ assertNotNull(
+ outFS.createDocumentInputStream("\005SummaryInformation")
+ );
+ assertNotNull(
+ outFS.createDocumentInputStream("\005DocumentSummaryInformation")
+ );
+ }
+
+ public void testWriteReadProperties() throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ // Write them out
+ POIFSFileSystem outFS = new POIFSFileSystem();
+ doc.writeProperties(outFS);
+ outFS.writeFilesystem(baos);
+
+ // Create a new version
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ POIFSFileSystem inFS = new POIFSFileSystem(bais);
+
+ // Check they're still there
+ doc.filesystem = inFS;
+ doc.readProperties();
+
+ // Delegate test
+ testReadProperties();
+ }
+}