]> source.dussan.org Git - poi.git/commitdiff
Common stress test for X/HSLF and a few bug fixes
authorAndreas Beeker <kiwiwings@apache.org>
Thu, 13 Aug 2015 00:10:11 +0000 (00:10 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Thu, 13 Aug 2015 00:10:11 +0000 (00:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1695628 13f79535-47bb-0310-9956-ffa450edef68

src/integrationtest/org/apache/poi/TestAllFiles.java
src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
src/integrationtest/org/apache/poi/stress/SlideShowHandler.java [new file with mode: 0644]
src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
src/java/org/apache/poi/sl/usermodel/SlideShow.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java

index 0a68579c16c18cdfd661d3a9d1d10dfb3b3d171c..51accdc31fbfe23b7c0bd2ff51692b42fbd566a8 100644 (file)
@@ -252,6 +252,12 @@ public class TestAllFiles {
         EXPECTED_FAILURES.add("ddf/47143.dat");
     }
 
+    private static final Set<String> IGNORED = new HashSet<String>();
+    static {
+        // need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
+        IGNORED.add("slideshow/42474-2.ppt");
+    }
+    
     @Parameters(name="{index}: {0} using {1}")
     public static Iterable<Object[]> files() {
         DirectoryScanner scanner = new DirectoryScanner();
@@ -265,6 +271,7 @@ public class TestAllFiles {
         List<Object[]> files = new ArrayList<Object[]>();
         for(String file : scanner.getIncludedFiles()) {
             file = file.replace('\\', '/'); // ... failures/handlers lookup doesn't work on windows otherwise
+            if (IGNORED.contains(file)) continue;
             files.add(new Object[] { file, HANDLERS.get(getExtension(file)) });
         }
 
index a946b18c12881fb0596c0119ea1186c3776881cc..838bbf7269744977786e0f4ebb88cddf7dfdb32c 100644 (file)
@@ -23,10 +23,11 @@ import java.io.FileInputStream;
 import java.io.InputStream;
 
 import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.junit.Test;
 
-public class HSLFFileHandler extends POIFSFileHandler {
+public class HSLFFileHandler extends SlideShowHandler {
        @Override
        public void handleFile(InputStream stream) throws Exception {
                HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
@@ -41,6 +42,9 @@ public class HSLFFileHandler extends POIFSFileHandler {
                }
                
                handlePOIDocument(slide);
+               
+               HSLFSlideShow ss = new HSLFSlideShow(slide);
+               handleSlideShow(ss);
        }
        
        // a test-case to test this locally without executing the full TestAllFiles
diff --git a/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java b/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
new file mode 100644 (file)
index 0000000..a4de13e
--- /dev/null
@@ -0,0 +1,135 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.stress;\r
+\r
+import static org.junit.Assert.assertNotNull;\r
+\r
+import java.awt.Dimension;\r
+import java.awt.Graphics2D;\r
+import java.awt.RenderingHints;\r
+import java.awt.image.BufferedImage;\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;\r
+import org.apache.poi.sl.SlideShowFactory;\r
+import org.apache.poi.sl.draw.Drawable;\r
+import org.apache.poi.sl.usermodel.Notes;\r
+import org.apache.poi.sl.usermodel.Shape;\r
+import org.apache.poi.sl.usermodel.ShapeContainer;\r
+import org.apache.poi.sl.usermodel.Slide;\r
+import org.apache.poi.sl.usermodel.SlideShow;\r
+import org.apache.poi.sl.usermodel.TextParagraph;\r
+import org.apache.poi.sl.usermodel.TextRun;\r
+import org.apache.poi.sl.usermodel.TextShape;\r
+import org.apache.poi.util.JvmBugs;\r
+\r
+public abstract class SlideShowHandler extends POIFSFileHandler {\r
+    public void handleSlideShow(SlideShow ss) throws IOException {\r
+        renderSlides(ss);\r
+\r
+        readContent(ss);\r
+\r
+        // write out the file\r
+        ByteArrayOutputStream out = writeToArray(ss);\r
+        \r
+        readContent(ss);\r
+\r
+        // read in the writen file\r
+        SlideShow read;\r
+        try {\r
+            read = SlideShowFactory.create(new ByteArrayInputStream(out.toByteArray()));\r
+        } catch (InvalidFormatException e) {\r
+            throw new IllegalStateException(e);\r
+        }\r
+        assertNotNull(read);\r
+        \r
+        readContent(read);\r
+        \r
+    }\r
+\r
+    private ByteArrayOutputStream writeToArray(SlideShow ss) throws IOException {\r
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();\r
+        try {\r
+            ss.write(stream);\r
+        } finally {\r
+            stream.close();\r
+        }\r
+        \r
+        return stream;\r
+    }\r
+\r
+    \r
+    private void readContent(SlideShow ss) {\r
+        for (Slide<?,?,? extends Notes<?,?>> s : ss.getSlides()) {\r
+            s.getTitle();\r
+            readText(s);\r
+            readText(s.getNotes());\r
+            readText(s.getMasterSheet());\r
+        }\r
+    }\r
+    \r
+    @SuppressWarnings("unchecked")\r
+    private void readText(ShapeContainer<?> sc) {\r
+        if (sc == null) return;\r
+        for (Shape s : sc) {\r
+            if (s instanceof TextShape) {\r
+                for (TextParagraph<? extends TextRun> tp : (TextShape<TextParagraph<? extends TextRun>>)s) {\r
+                    for (TextRun tr : tp) {\r
+                        tr.getRawText();\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    \r
+    private void renderSlides(SlideShow ss) {\r
+        Dimension pgsize = ss.getPageSize();\r
+\r
+        for (Slide<?,?,?> s : ss.getSlides()) {\r
+            BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_ARGB);\r
+            Graphics2D graphics = img.createGraphics();\r
+            fixFonts(graphics);\r
+\r
+            // default rendering options\r
+            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
+            graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\r
+            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);\r
+            graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);\r
+    \r
+            // draw stuff\r
+            s.draw(graphics);\r
+            \r
+            graphics.dispose();\r
+            img.flush();\r
+        }\r
+    }\r
+\r
+    @SuppressWarnings("unchecked")\r
+    private static void fixFonts(Graphics2D graphics) {\r
+        if (!JvmBugs.hasLineBreakMeasurerBug()) return;\r
+        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);\r
+        if (fontMap == null) fontMap = new HashMap<String,String>();\r
+        fontMap.put("Calibri", "Lucida Sans");\r
+        fontMap.put("Cambria", "Lucida Bright");\r
+        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);        \r
+    }\r
+\r
+}
\ No newline at end of file
index ba33ad589e73a5914ead8bb77b60740d2725ac55..e65c1225c05d8c884fcf82c5ebcd9de6d680716f 100644 (file)
@@ -18,82 +18,31 @@ package org.apache.poi.stress;
 
 import static org.junit.Assert.assertNotNull;
 
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.sl.draw.DrawFactory;
-import org.apache.poi.sl.draw.Drawable;
 import org.apache.poi.xslf.XSLFSlideShow;
 import org.apache.poi.xslf.usermodel.XMLSlideShow;
-import org.apache.poi.xslf.usermodel.XSLFNotes;
-import org.apache.poi.xslf.usermodel.XSLFShape;
-import org.apache.poi.xslf.usermodel.XSLFSlide;
-import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
-import org.apache.poi.xslf.usermodel.XSLFTextShape;
 import org.junit.Test;
 
-public class XSLFFileHandler extends AbstractFileHandler {
+public class XSLFFileHandler extends SlideShowHandler {
        @Override
     public void handleFile(InputStream stream) throws Exception {
-        XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
-               assertNotNull(slide.getPresentation());
-               assertNotNull(slide.getSlideMasterReferences());
-               assertNotNull(slide.getSlideReferences());
+           XMLSlideShow slide = new XMLSlideShow(stream);
+           XSLFSlideShow slideInner = new XSLFSlideShow(slide.getPackage());
+               assertNotNull(slideInner.getPresentation());
+               assertNotNull(slideInner.getSlideMasterReferences());
+               assertNotNull(slideInner.getSlideReferences());
                
                new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
 
-               ByteArrayOutputStream out = new ByteArrayOutputStream();
-               try {
-                   slide.write(out);
-               } finally {
-                   out.close();
-               }
+               handleSlideShow(slide);
                
-        createBitmaps(out);            
+               slideInner.close();
+               slide.close();
        }
 
-    private void createBitmaps(ByteArrayOutputStream out) throws IOException {
-        XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
-        Dimension pgsize = ppt.getPageSize();
-        for (XSLFSlide xmlSlide : ppt.getSlides()) {
-//            System.out.println("slide-" + (i + 1));
-//            System.out.println("" + xmlSlide[i].getTitle());
-
-            BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
-            Graphics2D graphics = img.createGraphics();
-
-            // draw stuff
-            xmlSlide.draw(graphics);
-
-            // Also try to read notes
-            XSLFNotes notes = xmlSlide.getNotes();
-            if(notes != null) {
-                for (XSLFShape note : notes) {
-                    DrawFactory df = DrawFactory.getInstance(graphics);
-                    Drawable d = df.getDrawable(note);
-                    d.draw(graphics);
-                    
-                    if (note instanceof XSLFTextShape) {
-                        XSLFTextShape txShape = (XSLFTextShape) note;
-                        for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
-                            xslfParagraph.getText();
-                        }
-                    }
-                }
-            }
-        }
-        
-        ppt.close();
-    }
-
        // a test-case to test this locally without executing the full TestAllFiles
        @Test
        public void test() throws Exception {
index e8f442821aa90e00b3ded888996cac2810c01c94..ac2a7a7d90f7feaf36ef5861bea5c83f26a5c711 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.sl.usermodel;
 
 import java.awt.Dimension;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.List;
 
 import org.apache.poi.sl.usermodel.PictureData.PictureType;
@@ -55,4 +56,16 @@ public interface SlideShow {
      * @return the new picture reference
      */
     PictureData addPicture(byte[] pictureData, PictureType format) throws IOException;
+
+    /**
+     * Writes out the slideshow file the is represented by an instance of this
+     * class
+     *
+     * @param out
+     *            The OutputStream to write to.
+     * @throws IOException
+     *             If there is an unexpected IOException from the passed in
+     *             OutputStream
+     */
+    void write(OutputStream out) throws IOException;
 }
index c90452ddaa11f0512f078258e80f3014c106631f..c6feb514e1398587990411ecbd496a1d64ef9261 100644 (file)
@@ -30,6 +30,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
 import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
 import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
 import org.apache.poi.util.Units;
 
 /**
@@ -346,11 +347,15 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape {
     }
 
     public Guide getAdjustValue(String name) {
-        if (name == null || !name.matches("adj([1-9]|10)")) {
+        if (name == null || !name.matches("adj([1-9]|10)?")) {
             throw new IllegalArgumentException("Adjust value '"+name+"' not supported.");
         }
+        
+        name = name.replace("adj", "");
+        if ("".equals(name)) name = "1";
+        
         short escherProp;
-        switch (Integer.parseInt(name.substring(3))) {
+        switch (Integer.parseInt(name)) {
             case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
             case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
             case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
@@ -369,13 +374,14 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape {
     }
 
     public CustomGeometry getGeometry() {
+        PresetGeometries dict = PresetGeometries.getInstance();
         ShapeType st = getShapeType();
         String name = st.getOoxmlName();
-        
-        PresetGeometries dict = PresetGeometries.getInstance();
         CustomGeometry geom = dict.get(name);
         if(geom == null) {
-            throw new IllegalStateException("Unknown shape geometry: " + name);
+            if (name == null && st != null) name = st.toString();
+            logger.log(POILogger.WARN, "No preset shape definition for shapeType: "+name);
+            return null;
         }
         
         return geom;
index 86604bf09be499cd1672206ec8ed3e1daf44d040..c1deea84416f7e2a1541647d596fa7d823b157f0 100644 (file)
@@ -431,16 +431,7 @@ public final class HSLFSlideShow implements SlideShow {
                }
        }
 
-       /**
-        * Writes out the slideshow file the is represented by an instance of this
-        * class
-        *
-        * @param out
-        *            The OutputStream to write to.
-        * @throws IOException
-        *             If there is an unexpected IOException from the passed in
-        *             OutputStream
-        */
+       @Override
        public void write(OutputStream out) throws IOException {
            // check for text paragraph modifications
            for (HSLFSlide sl : getSlides()) {
index e0f7479d6882c680e387e3594ad1f2c8fe349aa5..4b8b5dc2c877a54198800d88aac1aeb41477f5d4 100644 (file)
@@ -416,6 +416,7 @@ public final class HSLFSlideShowImpl extends POIDocument {
                                // Build the PictureData object from the data
                 try {
                                        HSLFPictureData pict = HSLFPictureData.create(pt);
+                                       pict.setSignature(signature);
 
                     // Copy the data, ready to pass to PictureData
                     byte[] imgdata = new byte[imgsize];