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
This commit is contained in:
Dominik Stadler 2019-03-02 12:28:19 +00:00
parent 53a30d796e
commit a9b2a8b2bd
6 changed files with 80 additions and 27 deletions

View File

@ -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();
}
}
}

View 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);
}

View 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();

View 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();

View 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());
}
}
}

Binary file not shown.