Quellcode durchsuchen

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
tags/REL_4_1_0
Dominik Stadler vor 5 Jahren
Ursprung
Commit
a9b2a8b2bd

+ 56
- 24
src/integrationtest/org/apache/poi/stress/SlideShowHandler.java Datei anzeigen

==================================================================== */ ==================================================================== */
package org.apache.poi.stress; 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.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; 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 abstract class SlideShowHandler extends POIFSFileHandler {
public void handleSlideShow(SlideShow<?,?> ss) throws IOException { public void handleSlideShow(SlideShow<?,?> ss) throws IOException {
private void readContent(SlideShow<?,?> ss) { private void readContent(SlideShow<?,?> ss) {
for (Slide<?,?> s : ss.getSlides()) { for (Slide<?,?> s : ss.getSlides()) {
s.getTitle(); 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();
} }
} }
} }

+ 4
- 1
src/java/org/apache/poi/sl/draw/DrawPaint.java Datei anzeigen

// snapToAnchor(p2, anchor); // snapToAnchor(p2, anchor);


// gradient paint on the same point throws an exception ... and doesn't make sense // 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);
} }





+ 1
- 1
src/ooxml/java/org/apache/poi/xddf/usermodel/XDDFGradientFillProperties.java Datei anzeigen

.getGsLst() .getGsLst()
.getGsList() .getGsList()
.stream() .stream()
.map(gs -> new XDDFGradientStop(gs))
.map(XDDFGradientStop::new)
.collect(Collectors.toList())); .collect(Collectors.toList()));
} else { } else {
return Collections.emptyList(); return Collections.emptyList();

+ 2
- 1
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java Datei anzeigen

protected static PaintStyle selectPaint(final CTGradientFillProperties gradFill, CTSchemeColor phClr, final XSLFTheme theme) { protected static PaintStyle selectPaint(final CTGradientFillProperties gradFill, CTSchemeColor phClr, final XSLFTheme theme) {


@SuppressWarnings("deprecation") @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) -> { Arrays.sort(gs, (o1, o2) -> {
int pos1 = o1.getPos(); int pos1 = o1.getPos();

+ 17
- 0
src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java Datei anzeigen



} }
} }

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

BIN
test-data/slideshow/63200.pptx Datei anzeigen


Laden…
Abbrechen
Speichern