From 92211d73aa319ab99788ac2502d21cbbc1445c4c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 3 Mar 2008 15:10:46 +0000 Subject: [PATCH] Fix from Yegor from bug #44491 - don't have the new style handy POIDocument property stuff break old style hpsf+hssf use git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@633118 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + src/java/org/apache/poi/POIDocument.java | 21 +++- .../poi/hssf/usermodel/HSSFWorkbook.java | 3 - .../org/apache/poi/TestPOIDocumentMain.java | 6 +- .../hssf/usermodel/TestPOIFSProperties.java | 98 +++++++++++++++++++ 6 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/usermodel/TestPOIFSProperties.java diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index ae32d44f8c..f043de44b6 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF 44471 - Crystal Reports generates files with short StyleRecords, which isn't allowed in the spec. Work around this 44450 - Support for Lookup, HLookup and VLookup functions 44449 - Avoid getting confused when two sheets have shared formulas for the same areas, and when the shared formula is set incorrectly diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index ec41cc5337..66c348de6a 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF 44471 - Crystal Reports generates files with short StyleRecords, which isn't allowed in the spec. Work around this 44450 - Support for Lookup, HLookup and VLookup functions 44449 - Avoid getting confused when two sheets have shared formulas for the same areas, and when the shared formula is set incorrectly diff --git a/src/java/org/apache/poi/POIDocument.java b/src/java/org/apache/poi/POIDocument.java index 8d91c06e79..075fa45381 100644 --- a/src/java/org/apache/poi/POIDocument.java +++ b/src/java/org/apache/poi/POIDocument.java @@ -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); diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 0cbafa32f1..e112da2212 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -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 diff --git a/src/testcases/org/apache/poi/TestPOIDocumentMain.java b/src/testcases/org/apache/poi/TestPOIDocumentMain.java index be3d9b0a78..5d4d7df19e 100644 --- a/src/testcases/org/apache/poi/TestPOIDocumentMain.java +++ b/src/testcases/org/apache/poi/TestPOIDocumentMain.java @@ -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 index 0000000000..9fe33ce6c9 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestPOIFSProperties.java @@ -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()); + + } +} -- 2.39.5