]> source.dussan.org Git - poi.git/commitdiff
Create a new Superclass, POIDocument, which handles the property (hpsf) stuff which...
authorNick Burch <nick@apache.org>
Tue, 4 Apr 2006 16:50:04 +0000 (16:50 +0000)
committerNick Burch <nick@apache.org>
Tue, 4 Apr 2006 16:50:04 +0000 (16:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@391363 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/POIDocument.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/testcases/org/apache/poi/TestPOIDocument.java [new file with mode: 0644]

diff --git a/src/scratchpad/src/org/apache/poi/POIDocument.java b/src/scratchpad/src/org/apache/poi/POIDocument.java
new file mode 100644 (file)
index 0000000..be9713a
--- /dev/null
@@ -0,0 +1,128 @@
+/* ====================================================================
+   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");
+               }
+       }
+}
index f6bd2cf9889c070bd2d368323210497c8b325855..e410f2caf35c0cf2eef39ce398794ea8664f873a 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.poi.hslf;
 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;
@@ -42,14 +43,11 @@ import org.apache.poi.hslf.usermodel.PictureData;
  * @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
@@ -104,6 +102,9 @@ public class HSLFSlideShow
 
                // Look for Property Streams:
                readProperties();
+               
+               // Look for other streams
+               readOtherStreams();
 
                // Look for Picture Streams:
                readPictures();
@@ -186,15 +187,10 @@ public class HSLFSlideShow
 
 
        /**
-        * 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);
@@ -233,36 +229,6 @@ public class HSLFSlideShow
        }
 
 
-  /** 
-   * 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
@@ -275,12 +241,7 @@ public class HSLFSlideShow
        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
@@ -342,24 +303,6 @@ public class HSLFSlideShow
    }
 
 
-  /**
-   * 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 ********************* */
 
        /**
@@ -418,16 +361,6 @@ public class HSLFSlideShow
         */
        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
         */
diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocument.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocument.java
new file mode 100644 (file)
index 0000000..7db746d
--- /dev/null
@@ -0,0 +1,95 @@
+
+/* ====================================================================
+   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();
+    }
+}