From: Dominik Stadler Date: Sat, 2 Mar 2019 12:28:19 +0000 (+0000) Subject: Bug 63200: Avoid NullPointerException in XSLFShape.selectPaint() and check some more... X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e98594ef0dd710ab490113309e6600b21eb2578f;p=poi.git Bug 63200: Avoid NullPointerException in XSLFShape.selectPaint() and check some more in integration tests git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1854639 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java b/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java index 374afa40af..9c0e7316d0 100644 --- a/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java +++ b/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java @@ -16,8 +16,18 @@ ==================================================================== */ 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 shapes = (GroupShape) s; + for (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(); } } } diff --git a/src/java/org/apache/poi/sl/draw/DrawPaint.java b/src/java/org/apache/poi/sl/draw/DrawPaint.java index 4fda618d0e..f012161b3c 100644 --- a/src/java/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/java/org/apache/poi/sl/draw/DrawPaint.java @@ -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); } diff --git a/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java b/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java index c46a58bb29..ab05448eec 100644 --- a/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java +++ b/src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java @@ -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(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index a11b62abb3..3df55edbaa 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -431,7 +431,8 @@ public abstract class XSLFShape implements Shape { 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(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 8867d69403..da25fc77e8 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -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 index 0000000000..6a8dc6cc84 Binary files /dev/null and b/test-data/slideshow/63200.pptx differ