]> source.dussan.org Git - poi.git/commitdiff
Bug 63200: Avoid NullPointerException in XSLFShape.selectPaint() and check some more...
authorDominik Stadler <centic@apache.org>
Sat, 2 Mar 2019 12:28:19 +0000 (12:28 +0000)
committerDominik Stadler <centic@apache.org>
Sat, 2 Mar 2019 12:28:19 +0000 (12:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1854639 13f79535-47bb-0310-9956-ffa450edef68

src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
src/java/org/apache/poi/sl/draw/DrawPaint.java
src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
test-data/slideshow/63200.pptx [new file with mode: 0644]

index 374afa40af03df38bfc45c6066c703c150613b35..9c0e7316d0e89d18bbd62a9fbfdcb467cdca343d 100644 (file)
 ==================================================================== */
 package org.apache.poi.stress;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.GroupShape;
+import org.apache.poi.sl.usermodel.Notes;
+import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.sl.usermodel.Shape;
+import org.apache.poi.sl.usermodel.SimpleShape;
+import org.apache.poi.sl.usermodel.Slide;
+import org.apache.poi.sl.usermodel.SlideShow;
+import org.apache.poi.sl.usermodel.SlideShowFactory;
+import org.apache.poi.sl.usermodel.TextParagraph;
+import org.apache.poi.sl.usermodel.TextRun;
+import org.apache.poi.sl.usermodel.TextShape;
 
 import java.awt.Dimension;
 import java.awt.Graphics2D;
@@ -28,16 +38,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.lang.ref.WeakReference;
 
-import org.apache.poi.sl.draw.Drawable;
-import org.apache.poi.sl.usermodel.PictureData;
-import org.apache.poi.sl.usermodel.Shape;
-import org.apache.poi.sl.usermodel.ShapeContainer;
-import org.apache.poi.sl.usermodel.Slide;
-import org.apache.poi.sl.usermodel.SlideShow;
-import org.apache.poi.sl.usermodel.SlideShowFactory;
-import org.apache.poi.sl.usermodel.TextParagraph;
-import org.apache.poi.sl.usermodel.TextRun;
-import org.apache.poi.sl.usermodel.TextShape;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public abstract class SlideShowHandler extends POIFSFileHandler {
     public void handleSlideShow(SlideShow<?,?> ss) throws IOException {
@@ -73,20 +75,50 @@ public abstract class SlideShowHandler extends POIFSFileHandler {
     private void readContent(SlideShow<?,?> ss) {
         for (Slide<?,?> s : ss.getSlides()) {
             s.getTitle();
-            readText(s);
-            readText(s.getNotes());
-            readText(s.getMasterSheet());
+
+            for (Shape<?,?> shape : s) {
+                readShapes(shape);
+            }
+
+            Notes<?, ?> notes = s.getNotes();
+            if(notes != null) {
+                for (Shape<?, ?> shape : notes) {
+                    readShapes(shape);
+                }
+            }
+
+            for (Shape<?,?> shape : s.getMasterSheet()) {
+                readShapes(shape);
+            }
         }
     }
-    
-    private void readText(ShapeContainer<?,?> sc) {
-        if (sc == null) return;
-        for (Shape<?,?> s : sc) {
-            if (s instanceof TextShape) {
-                for (TextParagraph<?,?,?> tp : (TextShape<?,?>)s) {
-                    for (TextRun tr : tp) {
-                        tr.getRawText();
-                    }
+
+    private void readShapes(Shape<?,?> s) {
+        // recursively walk group-shapes
+        if(s instanceof GroupShape) {
+            GroupShape<? extends Shape, ?> shapes = (GroupShape<? extends Shape, ?>) s;
+            for (Shape<? extends Shape, ?> shape : shapes) {
+                readShapes(shape);
+            }
+        }
+
+        if(s instanceof SimpleShape) {
+            SimpleShape<?, ?> simpleShape = (SimpleShape<?, ?>) s;
+
+            simpleShape.getFillColor();
+            simpleShape.getFillStyle();
+            simpleShape.getStrokeStyle();
+            simpleShape.getLineDecoration();
+        }
+
+        readText(s);
+    }
+
+    private void readText(Shape<?,?> s) {
+        if (s instanceof TextShape) {
+            for (TextParagraph<?,?,?> tp : (TextShape<?,?>)s) {
+                for (TextRun tr : tp) {
+                    tr.getRawText();
                 }
             }
         }
index 4fda618d0e52c2e303ab79efe7abb2726d6cc3a9..f012161b3c3727b6517fa518151f6b7d52bcd903 100644 (file)
@@ -407,7 +407,10 @@ public class DrawPaint {
 //        snapToAnchor(p2, anchor);
 
         // gradient paint on the same point throws an exception ... and doesn't make sense
-        return (p1.equals(p2)) ? null : safeFractions((f,c)->new LinearGradientPaint(p1,p2,f,c), fill);
+        // also having less than two fractions will not work
+        return (p1.equals(p2) || fill.getGradientFractions().length < 2) ?
+                null :
+                safeFractions((f,c)->new LinearGradientPaint(p1,p2,f,c), fill);
     }
 
 
index c46a58bb29dbae1f0a13c99e28d620de3c04be90..ab05448eece2a902e1b7274b6a472e1716f15f1a 100644 (file)
@@ -112,7 +112,7 @@ public class XDDFGradientFillProperties implements XDDFFillProperties {
                 .getGsLst()
                 .getGsList()
                 .stream()
-                .map(gs -> new XDDFGradientStop(gs))
+                .map(XDDFGradientStop::new)
                 .collect(Collectors.toList()));
         } else {
             return Collections.emptyList();
index a11b62abb3b9e7ea0719b5fb4b6daaaa43e239dc..3df55edbaa029fb4112969a6ff98acd3bbc3fb2b 100644 (file)
@@ -431,7 +431,8 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
     protected static PaintStyle selectPaint(final CTGradientFillProperties gradFill, CTSchemeColor phClr, final XSLFTheme theme) {
 
         @SuppressWarnings("deprecation")
-        final CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
+        final CTGradientStop[] gs = gradFill.getGsLst() == null ?
+                new CTGradientStop[0] : gradFill.getGsLst().getGsArray();
 
         Arrays.sort(gs, (o1, o2) -> {
             int pos1 = o1.getPos();
index 8867d694038eff63870b932b5307fedac46222d2..da25fc77e881c9646a511fe72706e267756117d5 100644 (file)
@@ -966,4 +966,21 @@ public class TestXSLFBugs {
 
         }
     }
+
+    @Test
+    public void bug63200() throws Exception {
+        try (XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("63200.pptx")) {
+            assertEquals(1, ss1.getSlides().size());
+
+            XSLFSlide slide = ss1.getSlides().get(0);
+
+            assertEquals(slide.getShapes().size(), 1);
+            XSLFGroupShape group = (XSLFGroupShape) slide.getShapes().get(0);
+            assertEquals(group.getShapes().size(), 2);
+            XSLFAutoShape oval = (XSLFAutoShape) group.getShapes().get(0);
+            XSLFAutoShape arrow = (XSLFAutoShape) group.getShapes().get(1);
+            assertNull(oval.getFillColor());
+            assertNull(arrow.getFillColor());
+        }
+    }
 }
diff --git a/test-data/slideshow/63200.pptx b/test-data/slideshow/63200.pptx
new file mode 100644 (file)
index 0000000..6a8dc6c
Binary files /dev/null and b/test-data/slideshow/63200.pptx differ