]> source.dussan.org Git - poi.git/commitdiff
Fix from Yegor from bug #44491 - don't have the new style handy POIDocument property...
authorNick Burch <nick@apache.org>
Mon, 3 Mar 2008 15:10:46 +0000 (15:10 +0000)
committerNick Burch <nick@apache.org>
Mon, 3 Mar 2008 15:10:46 +0000 (15:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@633118 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/POIDocument.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/testcases/org/apache/poi/TestPOIDocumentMain.java
src/testcases/org/apache/poi/hssf/usermodel/TestPOIFSProperties.java [new file with mode: 0644]

index ae32d44f8c2717614c087de37975b768c8dfbada..f043de44b6171a89be6ea4feab0b404f3a80187b 100644 (file)
@@ -36,6 +36,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1-beta1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF</action>
            <action dev="POI-DEVELOPERS" type="fix">44471 - Crystal Reports generates files with short StyleRecords, which isn't allowed in the spec. Work around this</action>
            <action dev="POI-DEVELOPERS" type="add">44450 - Support for Lookup, HLookup and VLookup functions</action>
            <action dev="POI-DEVELOPERS" type="fix">44449 - Avoid getting confused when two sheets have shared formulas for the same areas, and when the shared formula is set incorrectly</action>
index ec41cc53375aa4aeaa9536936ac068da7b4acd3e..66c348de6a11135961817724bdcb19917cfdde2e 100644 (file)
@@ -33,6 +33,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-beta1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF</action>
            <action dev="POI-DEVELOPERS" type="fix">44471 - Crystal Reports generates files with short StyleRecords, which isn't allowed in the spec. Work around this</action>
            <action dev="POI-DEVELOPERS" type="add">44450 - Support for Lookup, HLookup and VLookup functions</action>
            <action dev="POI-DEVELOPERS" type="fix">44449 - Avoid getting confused when two sheets have shared formulas for the same areas, and when the shared formula is set incorrectly</action>
index 8d91c06e79a9e4e7dc14ebd52ec679b745301733..075fa4538118f8533704fe1ed220ef4a9626e946 100644 (file)
@@ -54,16 +54,24 @@ public abstract class POIDocument {
        /** For our own logging use */
        protected POILogger logger = POILogFactory.getLogger(this.getClass());
 
-       
-       /** 
+    /* Have the property streams been read yet? (Only done on-demand) */
+    protected boolean initialized = false;
+
+       /**
         * Fetch the Document Summary Information of the document
         */
-       public DocumentSummaryInformation getDocumentSummaryInformation() { return dsInf; }
+       public DocumentSummaryInformation getDocumentSummaryInformation() {
+        if(!initialized) readProperties();
+        return dsInf;
+    }
 
        /** 
         * Fetch the Summary Information of the document
         */
-       public SummaryInformation getSummaryInformation() { return sInf; }
+       public SummaryInformation getSummaryInformation() {
+        if(!initialized) readProperties();
+        return sInf;
+    }
 
        /**
         * Find, and create objects for, the standard
@@ -89,6 +97,9 @@ public abstract class POIDocument {
                } else if(ps != null) {
                        logger.log(POILogger.WARN, "SummaryInformation property set came back with wrong class - ", ps.getClass());
                }
+
+               // Mark the fact that we've now loaded up the properties
+        initialized = true;
        }
 
        /** 
@@ -133,7 +144,7 @@ public abstract class POIDocument {
         * @param writtenEntries a list of POIFS entries to add the property names too
         */
        protected void writeProperties(POIFSFileSystem outFS, List writtenEntries) throws IOException {
-               if(sInf != null) {
+        if(sInf != null) {
                        writePropertySet(SummaryInformation.DEFAULT_STREAM_NAME,sInf,outFS);
                        if(writtenEntries != null) {
                                writtenEntries.add(SummaryInformation.DEFAULT_STREAM_NAME);
index 0cbafa32f1dc162f1479f514e7569d032a091c4d..e112da2212135b8c3e01338c6d7c3e9ce82601d7 100644 (file)
@@ -165,10 +165,7 @@ public class HSSFWorkbook extends POIDocument
             throws IOException
     {
         this.preserveNodes = preserveNodes;
-
-        // Read in the HPSF properties
         this.filesystem = fs;
-        readProperties();
         
         // If we're not preserving nodes, don't track the
         //  POIFS any more
index be3d9b0a782a9bf450d1ea3b98fc4cc55491540a..5d4d7df19e46db191386ef2f31da44f5fc8d3ab3 100644 (file)
@@ -85,7 +85,8 @@ public class TestPOIDocumentMain extends TestCase {
     public void testWriteProperties() throws Exception {
        // Just check we can write them back out into a filesystem
        POIFSFileSystem outFS = new POIFSFileSystem();
-       doc.writeProperties(outFS);
+       doc.readProperties();
+        doc.writeProperties(outFS);
        
        // Should now hold them
        assertNotNull(
@@ -101,7 +102,8 @@ public class TestPOIDocumentMain extends TestCase {
                
        // Write them out
        POIFSFileSystem outFS = new POIFSFileSystem();
-       doc.writeProperties(outFS);
+       doc.readProperties();
+        doc.writeProperties(outFS);
        outFS.writeFilesystem(baos);
        
        // Create a new version
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestPOIFSProperties.java b/src/testcases/org/apache/poi/hssf/usermodel/TestPOIFSProperties.java
new file mode 100644 (file)
index 0000000..9fe33ce
--- /dev/null
@@ -0,0 +1,98 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.hssf.usermodel;
+
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hpsf.SummaryInformation;
+import org.apache.poi.hpsf.PropertySetFactory;
+
+import java.io.FileInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+
+import junit.framework.TestCase;
+
+/**
+ * Old-style setting of POIFS properties doesn't work with POI 3.0.2
+ *
+ * @author Yegor Kozlov
+ */
+public class TestPOIFSProperties extends TestCase{
+    protected String cwd = System.getProperty("HSSF.testdata.path");
+
+    protected String title = "Testing POIFS properties";
+
+    public void testFail() throws Exception {
+        FileInputStream is = new FileInputStream(new File(cwd, "Simple.xls"));
+        POIFSFileSystem fs = new POIFSFileSystem(is);
+        is.close();
+
+        HSSFWorkbook wb = new HSSFWorkbook(fs);
+
+        //set POIFS properties after constructing HSSFWorkbook
+        //(a piece of code that used to work up to POI 3.0.2)
+        SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.create(fs.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
+        summary1.setTitle(title);
+        //write the modified property back to POIFS
+        fs.getRoot().getEntry(SummaryInformation.DEFAULT_STREAM_NAME).delete();
+        fs.createDocument(summary1.toInputStream(), SummaryInformation.DEFAULT_STREAM_NAME);
+
+        //save the workbook and read the property
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        wb.write(out);
+        out.close();
+
+        POIFSFileSystem fs2 = new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray()));
+        SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.create(fs2.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
+
+        try {
+            //failing assertion
+            assertEquals(title, summary2.getTitle());
+
+        } catch (AssertionError e){
+            assertTrue(true);
+        }
+    }
+
+    public void testOK() throws Exception {
+        FileInputStream is = new FileInputStream(new File(cwd, "Simple.xls"));
+        POIFSFileSystem fs = new POIFSFileSystem(is);
+        is.close();
+
+        //set POIFS properties before constructing HSSFWorkbook
+        SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.create(fs.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
+        summary1.setTitle(title);
+
+        fs.getRoot().getEntry(SummaryInformation.DEFAULT_STREAM_NAME).delete();
+        fs.createDocument(summary1.toInputStream(), SummaryInformation.DEFAULT_STREAM_NAME);
+
+        HSSFWorkbook wb = new HSSFWorkbook(fs);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        wb.write(out);
+        out.close();
+
+        //read the property
+        POIFSFileSystem fs2 = new POIFSFileSystem(new ByteArrayInputStream(out.toByteArray()));
+        SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.create(fs2.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME));
+        assertEquals(title, summary2.getTitle());
+
+    }
+}