diff options
author | Dominik Stadler <centic@apache.org> | 2019-03-02 12:28:19 +0000 |
---|---|---|
committer | Dominik Stadler <centic@apache.org> | 2019-03-02 12:28:19 +0000 |
commit | a9b2a8b2bd6e93ba85984be9a2aa8f9ac991c968 (patch) | |
tree | 20d3e5befc91d841ec77c54e09496e845d0c43a9 | |
parent | 53a30d796e27cf44eff2fdecf173b42e89430f61 (diff) | |
download | poi-a9b2a8b2bd6e93ba85984be9a2aa8f9ac991c968.tar.gz poi-a9b2a8b2bd6e93ba85984be9a2aa8f9ac991c968.zip |
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
-rw-r--r-- | src/integrationtest/org/apache/poi/stress/SlideShowHandler.java | 80 | ||||
-rw-r--r-- | src/java/org/apache/poi/sl/draw/DrawPaint.java | 5 | ||||
-rw-r--r-- | src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java | 2 | ||||
-rw-r--r-- | src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java | 3 | ||||
-rw-r--r-- | src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java | 17 | ||||
-rw-r--r-- | test-data/slideshow/63200.pptx | bin | 0 -> 36778 bytes |
6 files changed, 80 insertions, 27 deletions
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<? 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(); } } } 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<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(); 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 Binary files differnew file mode 100644 index 0000000000..6a8dc6cc84 --- /dev/null +++ b/test-data/slideshow/63200.pptx |