aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Stadler <centic@apache.org>2019-03-02 12:28:19 +0000
committerDominik Stadler <centic@apache.org>2019-03-02 12:28:19 +0000
commita9b2a8b2bd6e93ba85984be9a2aa8f9ac991c968 (patch)
tree20d3e5befc91d841ec77c54e09496e845d0c43a9
parent53a30d796e27cf44eff2fdecf173b42e89430f61 (diff)
downloadpoi-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.java80
-rw-r--r--src/java/org/apache/poi/sl/draw/DrawPaint.java5
-rw-r--r--src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java2
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java3
-rw-r--r--src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java17
-rw-r--r--test-data/slideshow/63200.pptxbin0 -> 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
new file mode 100644
index 0000000000..6a8dc6cc84
--- /dev/null
+++ b/test-data/slideshow/63200.pptx
Binary files differ