*/
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;
* @version 2.0-pre
*/
-public class HSSFWorkbook
+public class HSSFWorkbook extends POIDocument
{
private static final int DEBUG = POILogger.DEBUG;
*/
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
* @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
*/
{
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);
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
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);
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()
{
Object sub = subRecordIter.next();
if (sub instanceof EmbeddedObjectRefSubRecord)
{
- objects.add(new HSSFObjectData((ObjRecord) obj, poifs));
+ objects.add(new HSSFObjectData((ObjRecord) obj, filesystem));
}
}
}
--- /dev/null
+
+/* ====================================================================
+ 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();
+ }
+}
+++ /dev/null
-
-/* ====================================================================
- 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();
- }
-}
--- /dev/null
+
+/* ====================================================================
+ 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();
+ }
+}