From: Nick Burch Date: Wed, 19 Sep 2007 14:34:31 +0000 (+0000) Subject: Finish the POIDocument move, and update HSSFWorkbook to use it X-Git-Tag: REL_3_0_2_BETA1~41 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=63211783d6ac9cee15e01822e6a1adde99bfeffc;p=poi.git Finish the POIDocument move, and update HSSFWorkbook to use it git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@577314 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 75377728ab..8748270998 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -23,6 +23,7 @@ */ package org.apache.poi.hssf.usermodel; +import org.apache.poi.POIDocument; import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.EscherBitmapBlip; import org.apache.poi.ddf.EscherRecord; @@ -63,7 +64,7 @@ import java.util.Stack; * @version 2.0-pre */ -public class HSSFWorkbook +public class HSSFWorkbook extends POIDocument { private static final int DEBUG = POILogger.DEBUG; @@ -100,12 +101,6 @@ public class HSSFWorkbook */ private boolean preserveNodes; - /** - * if you do preserve the nodes, you'll need to hold the whole POIFS in - * memory. - */ - private POIFSFileSystem poifs; - /** * Used to keep track of the data formatter so that all * createDataFormatter calls return the same one for a given @@ -160,7 +155,8 @@ public class HSSFWorkbook * @param fs the POI filesystem that contains the Workbook stream. * @param preserveNodes whether to preseve other nodes, such as * macros. This takes more memory, so only say yes if you - * need to. + * need to. If set, will store all of the POIFSFileSystem + * in memory * @see org.apache.poi.poifs.filesystem.POIFSFileSystem * @exception IOException if the stream cannot be read */ @@ -170,8 +166,14 @@ public class HSSFWorkbook { this.preserveNodes = preserveNodes; - if (preserveNodes) { - this.poifs = fs; + // Read in the HPSF properties + this.filesystem = fs; + readProperties(); + + // If we're not preserving nodes, don't track the + // POIFS any more + if(! preserveNodes) { + this.filesystem = null; } sheets = new ArrayList(INITIAL_CAPACITY); @@ -904,11 +906,17 @@ public class HSSFWorkbook byte[] bytes = getBytes(); POIFSFileSystem fs = new POIFSFileSystem(); + // For tracking what we've written out, used if we're + // going to be preserving nodes + List excepts = new ArrayList(1); + + // Write out the Workbook stream fs.createDocument(new ByteArrayInputStream(bytes), "Workbook"); + + // Write out our HPFS properties, if we have them + writeProperties(fs, excepts); if (preserveNodes) { - List excepts = new ArrayList(1); - // Don't write out the old Workbook, we'll be doing our new one excepts.add("Workbook"); // If the file had WORKBOOK instead of Workbook, we'll write it @@ -916,7 +924,7 @@ public class HSSFWorkbook excepts.add("WORKBOOK"); // Copy over all the other nodes to our new poifs - copyNodes(this.poifs,fs,excepts); + copyNodes(this.filesystem,fs,excepts); } fs.writeFilesystem(stream); //poifs.writeFilesystem(stream); @@ -1171,58 +1179,6 @@ public class HSSFWorkbook return new HSSFPalette(workbook.getCustomPalette()); } - /** - * Copies nodes from one POIFS to the other minus the excepts - * @param source is the source POIFS to copy from - * @param target is the target POIFS to copy to - * @param excepts is a list of Strings specifying what nodes NOT to copy - */ - private void copyNodes(POIFSFileSystem source, POIFSFileSystem target, - List excepts) throws IOException { - //System.err.println("CopyNodes called"); - - DirectoryEntry root = source.getRoot(); - DirectoryEntry newRoot = target.getRoot(); - - Iterator entries = root.getEntries(); - - while (entries.hasNext()) { - Entry entry = (Entry)entries.next(); - if (!isInList(entry.getName(), excepts)) { - copyNodeRecursively(entry,newRoot); - } - } - } - - private boolean isInList(String entry, List list) { - for (int k = 0; k < list.size(); k++) { - if (list.get(k).equals(entry)) { - return true; - } - } - return false; - } - - private void copyNodeRecursively(Entry entry, DirectoryEntry target) - throws IOException { - //System.err.println("copyNodeRecursively called with "+entry.getName()+ - // ","+target.getName()); - DirectoryEntry newTarget = null; - if (entry.isDirectoryEntry()) { - newTarget = target.createDirectory(entry.getName()); - Iterator entries = ((DirectoryEntry)entry).getEntries(); - - while (entries.hasNext()) { - copyNodeRecursively((Entry)entries.next(),newTarget); - } - } else { - DocumentEntry dentry = (DocumentEntry)entry; - DocumentInputStream dstream = new DocumentInputStream(dentry); - target.createDocument(dentry.getName(),dstream); - dstream.close(); - } - } - /** Test only. Do not use */ public void insertChartRecord() { @@ -1433,7 +1389,7 @@ public class HSSFWorkbook Object sub = subRecordIter.next(); if (sub instanceof EmbeddedObjectRefSubRecord) { - objects.add(new HSSFObjectData((ObjRecord) obj, poifs)); + objects.add(new HSSFObjectData((ObjRecord) obj, filesystem)); } } } diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java new file mode 100644 index 0000000000..520409fcac --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java @@ -0,0 +1,122 @@ + +/* ==================================================================== + 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; + + +import junit.framework.TestCase; +import java.io.*; + +import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.poifs.filesystem.*; + +/** + * Tests that POIDocument correctly loads and saves the common + * (hspf) Document Properties + * + * This is part 2 of 2 of the tests - it only does the POIDocuments + * which are part of the scratchpad (not main) + * + * @author Nick Burch (nick at torchbox dot com) + */ +public class TestPOIDocumentScratchpad extends TestCase { + // The POI Documents to work on + private POIDocument doc; + private POIDocument doc2; + // POIFS primed on the test (powerpoint and word) data + private POIFSFileSystem pfs; + private POIFSFileSystem pfs2; + + /** + * Set things up, using a PowerPoint document and + * a Word Document for our testing + */ + public void setUp() throws Exception { + String dirnameHSLF = System.getProperty("HSLF.testdata.path"); + String filenameHSLF = dirnameHSLF + "/basic_test_ppt_file.ppt"; + String dirnameHSSF = System.getProperty("HSSF.testdata.path"); + String filenameHSSF = dirnameHSLF + "/DateFormats.ppt"; + String dirnameHWPF = System.getProperty("HWPF.testdata.path"); + String filenameHWPF = dirnameHWPF + "/test2.doc"; + + FileInputStream fisHSLF = new FileInputStream(filenameHSLF); + pfs = new POIFSFileSystem(fisHSLF); + doc = new HSLFSlideShow(pfs); + + FileInputStream fisHWPF = new FileInputStream(filenameHWPF); + pfs2 = new POIFSFileSystem(fisHWPF); + doc2 = new HWPFDocument(pfs2); + } + + 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 testReadProperties2() throws Exception { + // Check again on the word one + assertNotNull(doc2.getDocumentSummaryInformation()); + assertNotNull(doc2.getSummaryInformation()); + + assertEquals("Hogwarts", doc2.getSummaryInformation().getAuthor()); + assertEquals("", doc2.getSummaryInformation().getKeywords()); + assertEquals(0, doc2.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(); + } +} diff --git a/src/testcases/org/apache/poi/TestPOIDocument.java b/src/testcases/org/apache/poi/TestPOIDocument.java deleted file mode 100644 index 3b80aba7d9..0000000000 --- a/src/testcases/org/apache/poi/TestPOIDocument.java +++ /dev/null @@ -1,117 +0,0 @@ - -/* ==================================================================== - 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; - - -import junit.framework.TestCase; -import java.io.*; - -import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hwpf.HWPFDocument; -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 Documents to work on - private POIDocument doc; - private POIDocument doc2; - // POIFS primed on the test (powerpoint and word) data - private POIFSFileSystem pfs; - private POIFSFileSystem pfs2; - - /** - * Set things up, using a PowerPoint document and - * a Word Document for our testing - */ - public void setUp() throws Exception { - String dirnameHSLF = System.getProperty("HSLF.testdata.path"); - String filenameHSLF = dirnameHSLF + "/basic_test_ppt_file.ppt"; - String dirnameHWPF = System.getProperty("HWPF.testdata.path"); - String filenameHWPF = dirnameHWPF + "/test2.doc"; - - FileInputStream fisHSLF = new FileInputStream(filenameHSLF); - pfs = new POIFSFileSystem(fisHSLF); - doc = new HSLFSlideShow(pfs); - - FileInputStream fisHWPF = new FileInputStream(filenameHWPF); - pfs2 = new POIFSFileSystem(fisHWPF); - doc2 = new HWPFDocument(pfs2); - } - - 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 testReadProperties2() throws Exception { - // Check again on the word one - assertNotNull(doc2.getDocumentSummaryInformation()); - assertNotNull(doc2.getSummaryInformation()); - - assertEquals("Hogwarts", doc2.getSummaryInformation().getAuthor()); - assertEquals("", doc2.getSummaryInformation().getKeywords()); - assertEquals(0, doc2.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(); - } -} diff --git a/src/testcases/org/apache/poi/TestPOIDocumentMain.java b/src/testcases/org/apache/poi/TestPOIDocumentMain.java new file mode 100644 index 0000000000..be3d9b0a78 --- /dev/null +++ b/src/testcases/org/apache/poi/TestPOIDocumentMain.java @@ -0,0 +1,118 @@ + +/* ==================================================================== + 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; + + +import junit.framework.TestCase; +import java.io.*; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.*; + +/** + * Tests that POIDocument correctly loads and saves the common + * (hspf) Document Properties. + * + * This is part 1 of 2 of the tests - it only does the POIDocuments + * which are part of the Main (not scratchpad) + * + * @author Nick Burch (nick at torchbox dot com) + */ +public class TestPOIDocumentMain extends TestCase { + // The POI Documents to work on + private POIDocument doc; + private POIDocument doc2; + // POIFS primed on the test (two different hssf) data + private POIFSFileSystem pfs; + private POIFSFileSystem pfs2; + + /** + * Set things up, using a PowerPoint document and + * a Word Document for our testing + */ + public void setUp() throws Exception { + String dirnameHSSF = System.getProperty("HSSF.testdata.path"); + String filenameHSSF = dirnameHSSF + "/DateFormats.xls"; + String filenameHSSF2 = dirnameHSSF + "/StringFormulas.xls"; + + FileInputStream fisHSSF = new FileInputStream(filenameHSSF); + pfs = new POIFSFileSystem(fisHSSF); + doc = new HSSFWorkbook(pfs); + + FileInputStream fisHSSF2 = new FileInputStream(filenameHSSF2); + pfs2 = new POIFSFileSystem(fisHSSF2); + doc2 = new HSSFWorkbook(pfs2); + } + + 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("Administrator", doc.getSummaryInformation().getAuthor()); + assertEquals(0, doc.getDocumentSummaryInformation().getByteCount()); + } + + public void testReadProperties2() throws Exception { + // Check again on the word one + assertNotNull(doc2.getDocumentSummaryInformation()); + assertNotNull(doc2.getSummaryInformation()); + + assertEquals("Avik Sengupta", doc2.getSummaryInformation().getAuthor()); + assertEquals(null, doc2.getSummaryInformation().getKeywords()); + assertEquals(0, doc2.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(); + } +}