| /* ==================================================================== |
| 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.hslf; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.IOException; |
| |
| import org.apache.poi.POIDataSamples; |
| import org.apache.poi.hslf.usermodel.HSLFSlideShow; |
| import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; |
| import org.apache.poi.poifs.filesystem.DocumentEntry; |
| import org.apache.poi.poifs.filesystem.POIFSFileSystem; |
| import org.apache.poi.util.TempFile; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| /** |
| * Tests that HSLFSlideShow writes the powerpoint bit of data back out |
| * correctly. Currently, that means being the same as what it read in |
| * |
| * @author Nick Burch (nick at torchbox dot com) |
| */ |
| public final class TestReWrite { |
| // HSLFSlideShow primed on the test data |
| private HSLFSlideShowImpl hssA; |
| private HSLFSlideShowImpl hssB; |
| private HSLFSlideShowImpl hssC; |
| // POIFS primed on the test data |
| private POIFSFileSystem pfsA; |
| private POIFSFileSystem pfsB; |
| private POIFSFileSystem pfsC; |
| |
| @Before |
| public void setUp() throws Exception { |
| |
| POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); |
| |
| pfsA = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt")); |
| hssA = new HSLFSlideShowImpl(pfsA); |
| |
| pfsB = new POIFSFileSystem(slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt")); |
| hssB = new HSLFSlideShowImpl(pfsB); |
| |
| pfsC = new POIFSFileSystem(slTests.openResourceAsStream("WithMacros.ppt")); |
| hssC = new HSLFSlideShowImpl(pfsC); |
| } |
| |
| @Test |
| public void testWritesOutTheSame() throws Exception { |
| assertWritesOutTheSame(hssA, pfsA); |
| assertWritesOutTheSame(hssB, pfsB); |
| } |
| |
| public void assertWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception { |
| // Write out to a byte array, and to a temp file |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| hss.write(baos); |
| |
| final File file = TempFile.createTempFile("TestHSLF", ".ppt"); |
| final File file2 = TempFile.createTempFile("TestHSLF", ".ppt"); |
| hss.write(file); |
| hss.write(file2); |
| |
| |
| // Build an input stream of it, and read back as a POIFS from the stream |
| ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
| POIFSFileSystem npfS = new POIFSFileSystem(bais); |
| |
| // And the same on the temp file |
| POIFSFileSystem npfF = new POIFSFileSystem(file); |
| |
| // And another where we do an in-place write |
| POIFSFileSystem npfRF = new POIFSFileSystem(file2, false); |
| HSLFSlideShowImpl hssRF = new HSLFSlideShowImpl(npfRF); |
| hssRF.write(); |
| hssRF.close(); |
| npfRF = new POIFSFileSystem(file2); |
| |
| // Check all of them in turn |
| for (POIFSFileSystem npf : new POIFSFileSystem[] { npfS, npfF, npfRF }) { |
| // Check that the "PowerPoint Document" sections have the same size |
| DocumentEntry oProps = (DocumentEntry)pfs.getRoot().getEntry("PowerPoint Document"); |
| DocumentEntry nProps = (DocumentEntry)npf.getRoot().getEntry("PowerPoint Document"); |
| assertEquals(oProps.getSize(),nProps.getSize()); |
| |
| // Check that they contain the same data |
| byte[] _oData = new byte[oProps.getSize()]; |
| byte[] _nData = new byte[nProps.getSize()]; |
| pfs.createDocumentInputStream("PowerPoint Document").read(_oData); |
| npf.createDocumentInputStream("PowerPoint Document").read(_nData); |
| for(int i=0; i<_oData.length; i++) { |
| //System.out.println(i + "\t" + Integer.toHexString(i)); |
| assertEquals(_oData[i], _nData[i]); |
| } |
| npf.close(); |
| } |
| } |
| |
| @Test |
| public void testWithMacroStreams() throws IOException { |
| // Check that they're apparently the same |
| assertSlideShowWritesOutTheSame(hssC, pfsC); |
| |
| // Currently has a Macros stream |
| assertNotNull( pfsC.getRoot().getEntry("Macros") ); |
| |
| // Write out normally, will loose the macro stream |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| hssC.write(baos); |
| ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
| POIFSFileSystem pfsNew = new POIFSFileSystem(bais); |
| assertFalse(pfsNew.getRoot().hasEntry("Macros")); |
| pfsNew.close(); |
| |
| // But if we write out with nodes preserved, will be there |
| baos.reset(); |
| hssC.write(baos, true); |
| bais = new ByteArrayInputStream(baos.toByteArray()); |
| pfsNew = new POIFSFileSystem(bais); |
| assertTrue( pfsNew.getRoot().hasEntry("Macros") ); |
| pfsNew.close(); |
| } |
| |
| /** |
| * Ensure that simply opening a slideshow (usermodel) view of it |
| * doesn't change things |
| */ |
| @Test |
| public void testSlideShowWritesOutTheSame() throws Exception { |
| assertSlideShowWritesOutTheSame(hssA, pfsA); |
| |
| // Some bug in StyleTextPropAtom rewriting means this will fail |
| // We need to identify and fix that first |
| //assertSlideShowWritesOutTheSame(hssB, pfsB); |
| } |
| |
| public void assertSlideShowWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws IOException { |
| // Create a slideshow covering it |
| @SuppressWarnings("resource") |
| HSLFSlideShow ss = new HSLFSlideShow(hss); |
| ss.getSlides(); |
| ss.getNotes(); |
| |
| // Now write out to a byte array |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| hss.write(baos); |
| |
| // Build an input stream of it |
| ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
| |
| // Use POIFS to query that lot |
| POIFSFileSystem npfs = new POIFSFileSystem(bais); |
| |
| // Check that the "PowerPoint Document" sections have the same size |
| DocumentEntry oProps = (DocumentEntry)pfs.getRoot().getEntry("PowerPoint Document"); |
| DocumentEntry nProps = (DocumentEntry)npfs.getRoot().getEntry("PowerPoint Document"); |
| assertEquals(oProps.getSize(),nProps.getSize()); |
| |
| // Check that they contain the same data |
| byte[] _oData = new byte[oProps.getSize()]; |
| byte[] _nData = new byte[nProps.getSize()]; |
| pfs.createDocumentInputStream("PowerPoint Document").read(_oData); |
| npfs.createDocumentInputStream("PowerPoint Document").read(_nData); |
| for(int i=0; i<_oData.length; i++) { |
| if(_oData[i] != _nData[i]) |
| System.out.println(i + "\t" + Integer.toHexString(i)); |
| assertEquals(_oData[i], _nData[i]); |
| } |
| npfs.close(); |
| } |
| |
| @Test |
| public void test48593() throws IOException { |
| HSLFSlideShow ppt1 = new HSLFSlideShow(); |
| ppt1.createSlide(); |
| HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1); |
| ppt2.createSlide(); |
| HSLFSlideShow ppt3 = HSLFTestDataSamples.writeOutAndReadBack(ppt2); |
| ppt3.createSlide(); |
| HSLFSlideShow ppt4 = HSLFTestDataSamples.writeOutAndReadBack(ppt3); |
| ppt4.createSlide(); |
| HSLFTestDataSamples.writeOutAndReadBack(ppt4).close(); |
| ppt4.close(); |
| ppt3.close(); |
| ppt2.close(); |
| ppt1.close(); |
| } |
| } |