Author: kiwiwings
Date: Thu Aug 13 00:10:11 2015
New Revision: 1695628
URL: http://svn.apache.org/r1695628
Log:
Common stress test for X/HSLF and a few bug fixes
Added:
poi/trunk/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
Modified:
poi/trunk/src/integrationtest/org/apache/poi/TestAllFiles.java
poi/trunk/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
poi/trunk/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShow.java
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
Modified: poi/trunk/src/integrationtest/org/apache/poi/TestAllFiles.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/TestAllFiles.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/TestAllFiles.java (original)
+++ poi/trunk/src/integrationtest/org/apache/poi/TestAllFiles.java Thu Aug 13
00:10:11 2015
@@ -252,6 +252,12 @@ public class TestAllFiles {
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}")
public static Iterable<Object[]> files() {
DirectoryScanner scanner = new DirectoryScanner();
@@ -265,6 +271,7 @@ public class TestAllFiles {
List<Object[]> files = new ArrayList<Object[]>();
for(String file : scanner.getIncludedFiles()) {
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)) });
}
Modified:
poi/trunk/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
(original)
+++ poi/trunk/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
Thu Aug 13 00:10:11 2015
@@ -23,10 +23,11 @@ import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
import org.junit.Test;
-public class HSLFFileHandler extends POIFSFileHandler {
+public class HSLFFileHandler extends SlideShowHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
@@ -41,6 +42,9 @@ public class HSLFFileHandler extends POI
}
handlePOIDocument(slide);
+
+ HSLFSlideShow ss = new HSLFSlideShow(slide);
+ handleSlideShow(ss);
}
// a test-case to test this locally without executing the full
TestAllFiles
Added: poi/trunk/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java?rev=1695628&view=auto
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
(added)
+++ poi/trunk/src/integrationtest/org/apache/poi/stress/SlideShowHandler.java
Thu Aug 13 00:10:11 2015
@@ -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);
+ }
+
+}
\ No newline at end of file
Modified:
poi/trunk/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
--- poi/trunk/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
(original)
+++ poi/trunk/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
Thu Aug 13 00:10:11 2015
@@ -18,82 +18,31 @@ package org.apache.poi.stress;
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.FileInputStream;
-import java.io.IOException;
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.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;
-public class XSLFFileHandler extends AbstractFileHandler {
+public class XSLFFileHandler extends SlideShowHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
- XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
- assertNotNull(slide.getPresentation());
- assertNotNull(slide.getSlideMasterReferences());
- assertNotNull(slide.getSlideReferences());
+ XMLSlideShow slide = new XMLSlideShow(stream);
+ XSLFSlideShow slideInner = new XSLFSlideShow(slide.getPackage());
+ assertNotNull(slideInner.getPresentation());
+ assertNotNull(slideInner.getSlideMasterReferences());
+ assertNotNull(slideInner.getSlideReferences());
new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- slide.write(out);
- } finally {
- out.close();
- }
+ handleSlideShow(slide);
- 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
@Test
public void test() throws Exception {
Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShow.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShow.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShow.java (original)
+++ poi/trunk/src/java/org/apache/poi/sl/usermodel/SlideShow.java Thu Aug 13
00:10:11 2015
@@ -19,6 +19,7 @@ package org.apache.poi.sl.usermodel;
import java.awt.Dimension;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.List;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
@@ -55,4 +56,16 @@ public interface SlideShow {
* @return the new picture reference
*/
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;
}
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
(original)
+++
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
Thu Aug 13 00:10:11 2015
@@ -30,6 +30,7 @@ import org.apache.poi.sl.usermodel.Paint
import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
import org.apache.poi.util.Units;
/**
@@ -346,11 +347,15 @@ public abstract class HSLFSimpleShape ex
}
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.");
}
+
+ name = name.replace("adj", "");
+ if ("".equals(name)) name = "1";
+
short escherProp;
- switch (Integer.parseInt(name.substring(3))) {
+ switch (Integer.parseInt(name)) {
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE;
break;
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE;
break;
@@ -369,13 +374,14 @@ public abstract class HSLFSimpleShape ex
}
public CustomGeometry getGeometry() {
+ PresetGeometries dict = PresetGeometries.getInstance();
ShapeType st = getShapeType();
String name = st.getOoxmlName();
-
- PresetGeometries dict = PresetGeometries.getInstance();
CustomGeometry geom = dict.get(name);
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;
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
(original)
+++
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
Thu Aug 13 00:10:11 2015
@@ -431,16 +431,7 @@ public final class HSLFSlideShow impleme
}
}
- /**
- * 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
- */
+ @Override
public void write(OutputStream out) throws IOException {
// check for text paragraph modifications
for (HSLFSlide sl : getSlides()) {
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java?rev=1695628&r1=1695627&r2=1695628&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
(original)
+++
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
Thu Aug 13 00:10:11 2015
@@ -416,6 +416,7 @@ public final class HSLFSlideShowImpl ext
// Build the PictureData object from the data
try {
HSLFPictureData pict =
HSLFPictureData.create(pt);
+ pict.setSignature(signature);
// Copy the data, ready to pass to PictureData
byte[] imgdata = new byte[imgsize];
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]