Common stress test for X/HSLF and a few bug fixes
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1695628 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
36ee486049
commit
14df4b2824
@ -252,6 +252,12 @@ public class TestAllFiles {
|
|||||||
EXPECTED_FAILURES.add("ddf/47143.dat");
|
EXPECTED_FAILURES.add("ddf/47143.dat");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Set<String> IGNORED = new HashSet<String>();
|
||||||
|
static {
|
||||||
|
// need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
|
||||||
|
IGNORED.add("slideshow/42474-2.ppt");
|
||||||
|
}
|
||||||
|
|
||||||
@Parameters(name="{index}: {0} using {1}")
|
@Parameters(name="{index}: {0} using {1}")
|
||||||
public static Iterable<Object[]> files() {
|
public static Iterable<Object[]> files() {
|
||||||
DirectoryScanner scanner = new DirectoryScanner();
|
DirectoryScanner scanner = new DirectoryScanner();
|
||||||
@ -265,6 +271,7 @@ public class TestAllFiles {
|
|||||||
List<Object[]> files = new ArrayList<Object[]>();
|
List<Object[]> files = new ArrayList<Object[]>();
|
||||||
for(String file : scanner.getIncludedFiles()) {
|
for(String file : scanner.getIncludedFiles()) {
|
||||||
file = file.replace('\\', '/'); // ... failures/handlers lookup doesn't work on windows otherwise
|
file = file.replace('\\', '/'); // ... failures/handlers lookup doesn't work on windows otherwise
|
||||||
|
if (IGNORED.contains(file)) continue;
|
||||||
files.add(new Object[] { file, HANDLERS.get(getExtension(file)) });
|
files.add(new Object[] { file, HANDLERS.get(getExtension(file)) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,10 +23,11 @@ import java.io.FileInputStream;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
||||||
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
|
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class HSLFFileHandler extends POIFSFileHandler {
|
public class HSLFFileHandler extends SlideShowHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handleFile(InputStream stream) throws Exception {
|
public void handleFile(InputStream stream) throws Exception {
|
||||||
HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
|
HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
|
||||||
@ -41,6 +42,9 @@ public class HSLFFileHandler extends POIFSFileHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handlePOIDocument(slide);
|
handlePOIDocument(slide);
|
||||||
|
|
||||||
|
HSLFSlideShow ss = new HSLFSlideShow(slide);
|
||||||
|
handleSlideShow(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
|
135
src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
Normal file
135
src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.stress;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.RenderingHints;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.apache.poi.sl.SlideShowFactory;
|
||||||
|
import org.apache.poi.sl.draw.Drawable;
|
||||||
|
import org.apache.poi.sl.usermodel.Notes;
|
||||||
|
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.TextParagraph;
|
||||||
|
import org.apache.poi.sl.usermodel.TextRun;
|
||||||
|
import org.apache.poi.sl.usermodel.TextShape;
|
||||||
|
import org.apache.poi.util.JvmBugs;
|
||||||
|
|
||||||
|
public abstract class SlideShowHandler extends POIFSFileHandler {
|
||||||
|
public void handleSlideShow(SlideShow ss) throws IOException {
|
||||||
|
renderSlides(ss);
|
||||||
|
|
||||||
|
readContent(ss);
|
||||||
|
|
||||||
|
// write out the file
|
||||||
|
ByteArrayOutputStream out = writeToArray(ss);
|
||||||
|
|
||||||
|
readContent(ss);
|
||||||
|
|
||||||
|
// read in the writen file
|
||||||
|
SlideShow read;
|
||||||
|
try {
|
||||||
|
read = SlideShowFactory.create(new ByteArrayInputStream(out.toByteArray()));
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
assertNotNull(read);
|
||||||
|
|
||||||
|
readContent(read);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private ByteArrayOutputStream writeToArray(SlideShow ss) throws IOException {
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
try {
|
||||||
|
ss.write(stream);
|
||||||
|
} finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void readContent(SlideShow ss) {
|
||||||
|
for (Slide<?,?,? extends Notes<?,?>> s : ss.getSlides()) {
|
||||||
|
s.getTitle();
|
||||||
|
readText(s);
|
||||||
|
readText(s.getNotes());
|
||||||
|
readText(s.getMasterSheet());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void readText(ShapeContainer<?> sc) {
|
||||||
|
if (sc == null) return;
|
||||||
|
for (Shape s : sc) {
|
||||||
|
if (s instanceof TextShape) {
|
||||||
|
for (TextParagraph<? extends TextRun> tp : (TextShape<TextParagraph<? extends TextRun>>)s) {
|
||||||
|
for (TextRun tr : tp) {
|
||||||
|
tr.getRawText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderSlides(SlideShow ss) {
|
||||||
|
Dimension pgsize = ss.getPageSize();
|
||||||
|
|
||||||
|
for (Slide<?,?,?> s : ss.getSlides()) {
|
||||||
|
BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D graphics = img.createGraphics();
|
||||||
|
fixFonts(graphics);
|
||||||
|
|
||||||
|
// default rendering options
|
||||||
|
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||||
|
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
|
||||||
|
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
|
||||||
|
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
|
||||||
|
|
||||||
|
// draw stuff
|
||||||
|
s.draw(graphics);
|
||||||
|
|
||||||
|
graphics.dispose();
|
||||||
|
img.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static void fixFonts(Graphics2D graphics) {
|
||||||
|
if (!JvmBugs.hasLineBreakMeasurerBug()) return;
|
||||||
|
Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);
|
||||||
|
if (fontMap == null) fontMap = new HashMap<String,String>();
|
||||||
|
fontMap.put("Calibri", "Lucida Sans");
|
||||||
|
fontMap.put("Cambria", "Lucida Bright");
|
||||||
|
graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,80 +18,29 @@ package org.apache.poi.stress;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
|
||||||
import org.apache.poi.sl.draw.DrawFactory;
|
|
||||||
import org.apache.poi.sl.draw.Drawable;
|
|
||||||
import org.apache.poi.xslf.XSLFSlideShow;
|
import org.apache.poi.xslf.XSLFSlideShow;
|
||||||
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
||||||
import org.apache.poi.xslf.usermodel.XSLFNotes;
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFShape;
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFSlide;
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFTextShape;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class XSLFFileHandler extends AbstractFileHandler {
|
public class XSLFFileHandler extends SlideShowHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handleFile(InputStream stream) throws Exception {
|
public void handleFile(InputStream stream) throws Exception {
|
||||||
XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
|
XMLSlideShow slide = new XMLSlideShow(stream);
|
||||||
assertNotNull(slide.getPresentation());
|
XSLFSlideShow slideInner = new XSLFSlideShow(slide.getPackage());
|
||||||
assertNotNull(slide.getSlideMasterReferences());
|
assertNotNull(slideInner.getPresentation());
|
||||||
assertNotNull(slide.getSlideReferences());
|
assertNotNull(slideInner.getSlideMasterReferences());
|
||||||
|
assertNotNull(slideInner.getSlideReferences());
|
||||||
|
|
||||||
new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
|
new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
handleSlideShow(slide);
|
||||||
try {
|
|
||||||
slide.write(out);
|
|
||||||
} finally {
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
createBitmaps(out);
|
slideInner.close();
|
||||||
}
|
slide.close();
|
||||||
|
|
||||||
private void createBitmaps(ByteArrayOutputStream out) throws IOException {
|
|
||||||
XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
|
|
||||||
Dimension pgsize = ppt.getPageSize();
|
|
||||||
for (XSLFSlide xmlSlide : ppt.getSlides()) {
|
|
||||||
// System.out.println("slide-" + (i + 1));
|
|
||||||
// System.out.println("" + xmlSlide[i].getTitle());
|
|
||||||
|
|
||||||
BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
|
|
||||||
Graphics2D graphics = img.createGraphics();
|
|
||||||
|
|
||||||
// draw stuff
|
|
||||||
xmlSlide.draw(graphics);
|
|
||||||
|
|
||||||
// Also try to read notes
|
|
||||||
XSLFNotes notes = xmlSlide.getNotes();
|
|
||||||
if(notes != null) {
|
|
||||||
for (XSLFShape note : notes) {
|
|
||||||
DrawFactory df = DrawFactory.getInstance(graphics);
|
|
||||||
Drawable d = df.getDrawable(note);
|
|
||||||
d.draw(graphics);
|
|
||||||
|
|
||||||
if (note instanceof XSLFTextShape) {
|
|
||||||
XSLFTextShape txShape = (XSLFTextShape) note;
|
|
||||||
for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
|
|
||||||
xslfParagraph.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ppt.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.sl.usermodel;
|
|||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
import org.apache.poi.sl.usermodel.PictureData.PictureType;
|
||||||
@ -55,4 +56,16 @@ public interface SlideShow {
|
|||||||
* @return the new picture reference
|
* @return the new picture reference
|
||||||
*/
|
*/
|
||||||
PictureData addPicture(byte[] pictureData, PictureType format) throws IOException;
|
PictureData addPicture(byte[] pictureData, PictureType format) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes out the slideshow file the is represented by an instance of this
|
||||||
|
* class
|
||||||
|
*
|
||||||
|
* @param out
|
||||||
|
* The OutputStream to write to.
|
||||||
|
* @throws IOException
|
||||||
|
* If there is an unexpected IOException from the passed in
|
||||||
|
* OutputStream
|
||||||
|
*/
|
||||||
|
void write(OutputStream out) throws IOException;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
|||||||
import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
|
||||||
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -346,11 +347,15 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Guide getAdjustValue(String name) {
|
public Guide getAdjustValue(String name) {
|
||||||
if (name == null || !name.matches("adj([1-9]|10)")) {
|
if (name == null || !name.matches("adj([1-9]|10)?")) {
|
||||||
throw new IllegalArgumentException("Adjust value '"+name+"' not supported.");
|
throw new IllegalArgumentException("Adjust value '"+name+"' not supported.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = name.replace("adj", "");
|
||||||
|
if ("".equals(name)) name = "1";
|
||||||
|
|
||||||
short escherProp;
|
short escherProp;
|
||||||
switch (Integer.parseInt(name.substring(3))) {
|
switch (Integer.parseInt(name)) {
|
||||||
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
|
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
|
||||||
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
|
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
|
||||||
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
|
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
|
||||||
@ -369,13 +374,14 @@ public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CustomGeometry getGeometry() {
|
public CustomGeometry getGeometry() {
|
||||||
|
PresetGeometries dict = PresetGeometries.getInstance();
|
||||||
ShapeType st = getShapeType();
|
ShapeType st = getShapeType();
|
||||||
String name = st.getOoxmlName();
|
String name = st.getOoxmlName();
|
||||||
|
|
||||||
PresetGeometries dict = PresetGeometries.getInstance();
|
|
||||||
CustomGeometry geom = dict.get(name);
|
CustomGeometry geom = dict.get(name);
|
||||||
if(geom == null) {
|
if(geom == null) {
|
||||||
throw new IllegalStateException("Unknown shape geometry: " + name);
|
if (name == null && st != null) name = st.toString();
|
||||||
|
logger.log(POILogger.WARN, "No preset shape definition for shapeType: "+name);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return geom;
|
return geom;
|
||||||
|
@ -431,16 +431,7 @@ public final class HSLFSlideShow implements SlideShow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Writes out the slideshow file the is represented by an instance of this
|
|
||||||
* class
|
|
||||||
*
|
|
||||||
* @param out
|
|
||||||
* The OutputStream to write to.
|
|
||||||
* @throws IOException
|
|
||||||
* If there is an unexpected IOException from the passed in
|
|
||||||
* OutputStream
|
|
||||||
*/
|
|
||||||
public void write(OutputStream out) throws IOException {
|
public void write(OutputStream out) throws IOException {
|
||||||
// check for text paragraph modifications
|
// check for text paragraph modifications
|
||||||
for (HSLFSlide sl : getSlides()) {
|
for (HSLFSlide sl : getSlides()) {
|
||||||
|
@ -416,6 +416,7 @@ public final class HSLFSlideShowImpl extends POIDocument {
|
|||||||
// Build the PictureData object from the data
|
// Build the PictureData object from the data
|
||||||
try {
|
try {
|
||||||
HSLFPictureData pict = HSLFPictureData.create(pt);
|
HSLFPictureData pict = HSLFPictureData.create(pt);
|
||||||
|
pict.setSignature(signature);
|
||||||
|
|
||||||
// Copy the data, ready to pass to PictureData
|
// Copy the data, ready to pass to PictureData
|
||||||
byte[] imgdata = new byte[imgsize];
|
byte[] imgdata = new byte[imgsize];
|
||||||
|
Loading…
Reference in New Issue
Block a user