From 2c086c590e50ad6beb467ae6d09c977adbc8f060 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 26 Oct 2016 22:32:46 +0000 Subject: [PATCH] Bug 60059 - Deprecate xslf.usermodel.Drawing* - was: Can't change text of DrawingParagraph git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1766746 13f79535-47bb-0310-9956-ffa450edef68 --- .../extractor/XSLFPowerPointExtractor.java | 173 ++++++++++-------- .../poi/xslf/usermodel/DrawingParagraph.java | 5 + .../poi/xslf/usermodel/DrawingTable.java | 5 + .../poi/xslf/usermodel/DrawingTableCell.java | 5 + .../poi/xslf/usermodel/DrawingTableRow.java | 5 + .../poi/xslf/usermodel/DrawingTextBody.java | 5 + .../usermodel/DrawingTextPlaceholder.java | 5 + .../xslf/usermodel/XSLFCommonSlideData.java | 5 + .../apache/poi/xslf/usermodel/XSLFSheet.java | 11 +- .../org/apache/poi/xslf/TestXSLFBugs.java | 10 +- .../TestXSLFPowerPointExtractor.java | 13 +- 11 files changed, 151 insertions(+), 91 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java index ddcbfff2c..5f757d0c5 100644 --- a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java +++ b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java @@ -17,24 +17,25 @@ package org.apache.poi.xslf.extractor; import java.io.IOException; -import java.util.List; import org.apache.poi.POIXMLTextExtractor; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.xslf.usermodel.DrawingParagraph; -import org.apache.poi.xslf.usermodel.DrawingTextBody; -import org.apache.poi.xslf.usermodel.DrawingTextPlaceholder; import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFCommentAuthors; import org.apache.poi.xslf.usermodel.XSLFComments; -import org.apache.poi.xslf.usermodel.XSLFCommonSlideData; import org.apache.poi.xslf.usermodel.XSLFNotes; import org.apache.poi.xslf.usermodel.XSLFRelation; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.apache.poi.xslf.usermodel.XSLFShapeContainer; import org.apache.poi.xslf.usermodel.XSLFSlide; import org.apache.poi.xslf.usermodel.XSLFSlideLayout; import org.apache.poi.xslf.usermodel.XSLFSlideMaster; import org.apache.poi.xslf.usermodel.XSLFSlideShow; +import org.apache.poi.xslf.usermodel.XSLFTable; +import org.apache.poi.xslf.usermodel.XSLFTableCell; +import org.apache.poi.xslf.usermodel.XSLFTableRow; +import org.apache.poi.xslf.usermodel.XSLFTextShape; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.presentationml.x2006.main.CTComment; import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentAuthor; @@ -115,84 +116,108 @@ public class XSLFPowerPointExtractor extends POIXMLTextExtractor { /** * Gets the requested text from the file + * * @param slideText Should we retrieve text from slides? * @param notesText Should we retrieve text from notes? * @param masterText Should we retrieve text from master slides? + * + * @return the extracted text */ public String getText(boolean slideText, boolean notesText, boolean masterText) { - StringBuffer text = new StringBuffer(); + StringBuilder text = new StringBuilder(); - List slides = slideshow.getSlides(); - XSLFCommentAuthors commentAuthors = slideshow.getCommentAuthors(); - - for (XSLFSlide slide : slides) { - try { - XSLFNotes notes = slide.getNotes(); - XSLFComments comments = slide.getComments(); - XSLFSlideLayout layout = slide.getSlideLayout(); - XSLFSlideMaster master = layout.getSlideMaster(); - - // TODO Do the slide's name - // (Stored in docProps/app.xml) - - // Do the slide's text if requested - if (slideText) { - extractText(slide.getCommonSlideData(), false, text); - - // If requested, get text from the master and it's layout - if(masterText) { - if(layout != null) { - extractText(layout.getCommonSlideData(), true, text); - } - if(master != null) { - extractText(master.getCommonSlideData(), true, text); - } - } - - // If the slide has comments, do those too - if (comments != null) { - for (CTComment comment : comments.getCTCommentsList().getCmArray()) { - // Do the author if we can - if (commentAuthors != null) { - CTCommentAuthor author = commentAuthors.getAuthorById(comment.getAuthorId()); - if(author != null) { - text.append(author.getName() + ": "); - } - } - - // Then the comment text, with a new line afterwards - text.append(comment.getText()); - text.append("\n"); - } - } - } - - // Do the notes if requested - if (notesText && notes != null) { - extractText(notes.getCommonSlideData(), false, text); - } - } catch (Exception e) { - throw new RuntimeException(e); - } + for (XSLFSlide slide : slideshow.getSlides()) { + text.append(getText(slide, slideText, notesText, masterText)); } return text.toString(); } - - private void extractText(XSLFCommonSlideData data, boolean skipPlaceholders, StringBuffer text) { - for(DrawingTextBody textBody : data.getDrawingText()) { - if(skipPlaceholders && textBody instanceof DrawingTextPlaceholder) { - DrawingTextPlaceholder ph = (DrawingTextPlaceholder)textBody; - if(! ph.isPlaceholderCustom()) { - // Skip non-customised placeholder text - continue; - } - } - - for (DrawingParagraph p : textBody.getParagraphs()) { - text.append(p.getText()); - text.append("\n"); - } - } + + /** + * Gets the requested text from the slide + * + * @param slide the slide to retrieve the text from + * @param slideText Should we retrieve text from slides? + * @param notesText Should we retrieve text from notes? + * @param masterText Should we retrieve text from master slides? + * + * @return the extracted text + */ + public static String getText(XSLFSlide slide, boolean slideText, boolean notesText, boolean masterText) { + StringBuilder text = new StringBuilder(); + + XSLFCommentAuthors commentAuthors = slide.getSlideShow().getCommentAuthors(); + + XSLFNotes notes = slide.getNotes(); + XSLFComments comments = slide.getComments(); + XSLFSlideLayout layout = slide.getSlideLayout(); + XSLFSlideMaster master = layout.getSlideMaster(); + + // TODO Do the slide's name + // (Stored in docProps/app.xml) + + // Do the slide's text if requested + if (slideText) { + extractText(slide, false, text); + + // If requested, get text from the master and it's layout + if(masterText) { + if(layout != null) { + extractText(layout, true, text); + } + if(master != null) { + extractText(master, true, text); + } + } + + // If the slide has comments, do those too + if (comments != null) { + for (CTComment comment : comments.getCTCommentsList().getCmArray()) { + // Do the author if we can + if (commentAuthors != null) { + CTCommentAuthor author = commentAuthors.getAuthorById(comment.getAuthorId()); + if(author != null) { + text.append(author.getName() + ": "); + } + } + + // Then the comment text, with a new line afterwards + text.append(comment.getText()); + text.append("\n"); + } + } + } + + // Do the notes if requested + if (notesText && notes != null) { + extractText(notes, false, text); + } + + return text.toString(); + } + + private static void extractText(XSLFShapeContainer data, boolean skipPlaceholders, StringBuilder text) { + for (XSLFShape s : data) { + if (s instanceof XSLFShapeContainer) { + extractText((XSLFShapeContainer)s, skipPlaceholders, text); + } else if (s instanceof XSLFTextShape) { + XSLFTextShape ts = (XSLFTextShape)s; + // Skip non-customised placeholder text + if (!(skipPlaceholders && ts.isPlaceholder())) { + text.append(ts.getText()); + text.append("\n"); + } + } else if (s instanceof XSLFTable) { + XSLFTable ts = (XSLFTable)s; + // Skip non-customised placeholder text + for (XSLFTableRow r : ts) { + for (XSLFTableCell c : r) { + text.append(c.getText()); + text.append("\t"); + } + text.append("\n"); + } + } + } } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java index 2e755583b..6a6ee3807 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingParagraph.java @@ -17,12 +17,17 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; +/* + * @deprecated POI 3.16 beta 1. Instead iterate over the shapes/notes of the slides + */ +@Removal(version="3.18") public class DrawingParagraph { private final CTTextParagraph p; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java index 037ae65d9..b59a5bb23 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTable.java @@ -17,9 +17,14 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.openxmlformats.schemas.drawingml.x2006.main.CTTable; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow; +/* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ +@Removal(version="3.18") public class DrawingTable { private final CTTable table; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableCell.java index 492c2f5e1..2924fbc74 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableCell.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableCell.java @@ -17,8 +17,13 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; +/* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ +@Removal(version="3.18") public class DrawingTableCell { private final CTTableCell cell; private final DrawingTextBody drawingTextBody; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableRow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableRow.java index 70aa159a9..08a693959 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableRow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTableRow.java @@ -17,9 +17,14 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow; +/* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ +@Removal(version="3.18") public class DrawingTableRow { private final CTTableRow row; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java index c3f7778b8..7f6aa4bab 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextBody.java @@ -17,9 +17,14 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; +/* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ +@Removal(version="3.18") public class DrawingTextBody { private final CTTextBody textBody; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextPlaceholder.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextPlaceholder.java index ec95bd1d5..841cc2d32 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextPlaceholder.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/DrawingTextPlaceholder.java @@ -17,6 +17,7 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.util.Removal; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; @@ -26,6 +27,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; * @author nick * */ +/* + * @deprecated POI 3.16 beta 1. use ??? instead + */ +@Removal(version="3.18") public class DrawingTextPlaceholder extends DrawingTextBody { private final CTPlaceholder placeholder; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommonSlideData.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommonSlideData.java index 15a62a833..2fd336543 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommonSlideData.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommonSlideData.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.poi.POIXMLException; import org.apache.poi.util.Beta; +import org.apache.poi.util.Removal; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; @@ -38,6 +39,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; +/* + * @deprecated POI 3.16 beta 1. - iterate over the shapes of a slide instead + */ +@Removal(version="3.18") @Beta public class XSLFCommonSlideData { private final CTCommonSlideData data; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 70ee99ccd..1edfff7cc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -47,6 +47,7 @@ import org.apache.poi.sl.usermodel.Sheet; import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Internal; +import org.apache.poi.util.Removal; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData; @@ -128,11 +129,19 @@ implements XSLFShapeContainer, Sheet { */ public abstract XmlObject getXmlObject(); + /* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ + @Removal(version="3.18") @Internal public XSLFCommonSlideData getCommonSlideData() { return _commonSlideData; } + /* + * @deprecated POI 3.16 beta 1. use {@link XSLFTable} instead + */ + @Removal(version="3.18") protected void setCommonSlideData(CTCommonSlideData data) { if(data == null) { _commonSlideData = null; @@ -550,7 +559,6 @@ implements XSLFShapeContainer, Sheet { * @param packagePart package part containing the data to import * @return ID of the created relationship */ - @SuppressWarnings("resource") String importBlip(String blipId, PackagePart packagePart) { PackageRelationship blipRel = packagePart.getRelationship(blipId); PackagePart blipPart; @@ -573,7 +581,6 @@ implements XSLFShapeContainer, Sheet { /** * Import a package part into this sheet. */ - @SuppressWarnings("resource") PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) { PackagePart destPP = getPackagePart(); PackagePartName srcPPName = srcPafrt.getPartName(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index dcf8c1cb8..cd475fcce 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -51,6 +51,7 @@ import org.apache.poi.sl.usermodel.PictureData; import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.VerticalAlignment; +import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; import org.apache.poi.xslf.usermodel.DrawingParagraph; import org.apache.poi.xslf.usermodel.DrawingTextBody; import org.apache.poi.xslf.usermodel.XMLSlideShow; @@ -252,14 +253,7 @@ public class TestXSLFBugs { } protected String getSlideText(XSLFSlide slide) { - StringBuffer text = new StringBuffer(); - for(DrawingTextBody textBody : slide.getCommonSlideData().getDrawingText()) { - for (DrawingParagraph p : textBody.getParagraphs()) { - text.append(p.getText()); - text.append("\n"); - } - } - return text.toString(); + return XSLFPowerPointExtractor.getText(slide, true, false, false); } @Test diff --git a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java index d3c7c97db..f76e084f9 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java @@ -97,21 +97,21 @@ public class TestXSLFPowerPointExtractor { // Just notes, no slides text = extractor.getText(false, true); - assertEquals("\n\n\n\n", text); + assertEquals("\n\n1\n\n\n2\n", text); // Both text = extractor.getText(true, true, false); String bothText = "Lorem ipsum dolor sit amet\n" + "Nunc at risus vel erat tempus posuere. Aenean non ante.\n" + - "\n\n\n" + + "\n\n\n1\n" + "Lorem ipsum dolor sit amet\n" + "Lorem\n" + "ipsum\n" + "dolor\n" + "sit\n" + "amet\n" + - "\n\n\n"; + "\n\n\n2\n"; assertEquals(bothText, text); // With Slides and Master Text @@ -134,22 +134,21 @@ public class TestXSLFPowerPointExtractor { String snmText = "Lorem ipsum dolor sit amet\n" + "Nunc at risus vel erat tempus posuere. Aenean non ante.\n" + - "\n" + - "\n\n" + + "\n\n\n1\n" + "Lorem ipsum dolor sit amet\n" + "Lorem\n" + "ipsum\n" + "dolor\n" + "sit\n" + "amet\n" + - "\n\n\n"; + "\n\n\n2\n"; assertEquals(snmText, text); // Via set defaults extractor.setSlidesByDefault(false); extractor.setNotesByDefault(true); text = extractor.getText(); - assertEquals("\n\n\n\n", text); + assertEquals("\n\n1\n\n\n2\n", text); extractor.close(); xmlA.close();