]> source.dussan.org Git - poi.git/commitdiff
#62587 - repeated call to XSLFSheet.removeShape leads to java.lang.IllegalArgumentExc...
authorAndreas Beeker <kiwiwings@apache.org>
Sat, 11 Aug 2018 01:55:39 +0000 (01:55 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sat, 11 Aug 2018 01:55:39 +0000 (01:55 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1837839 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java

index bcab1dabae1f1e06f91983467ddc00330594d1e2..1d077b73db54a1328cfa7f8c66d04b9ea991dd9a 100644 (file)
@@ -25,9 +25,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.openxml4j.opc.TargetMode;
+import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
 import org.apache.poi.sl.draw.DrawPictureShape;
 import org.apache.poi.sl.usermodel.GroupShape;
 import org.apache.poi.sl.usermodel.PictureData;
@@ -74,7 +72,7 @@ implements XSLFShapeContainer, GroupShape<XSLFShape,XSLFTextParagraph> {
         return _grpSpPr;
     }
     
-    protected CTGroupTransform2D getSafeXfrm() {
+    private CTGroupTransform2D getSafeXfrm() {
         CTGroupTransform2D xfrm = getXfrm();
         return (xfrm == null ? getGrpSpPr().addNewXfrm() : xfrm);
     }
@@ -267,13 +265,9 @@ implements XSLFShapeContainer, GroupShape<XSLFShape,XSLFTextParagraph> {
         if (!(pictureData instanceof XSLFPictureData)) {
             throw new IllegalArgumentException("pictureData needs to be of type XSLFPictureData");
         }
-        XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
-        PackagePart pic = xPictureData.getPackagePart();
+        RelationPart rp = getSheet().addRelation(null, XSLFRelation.IMAGES, (XSLFPictureData)pictureData);
 
-        PackageRelationship rel = getSheet().getPackagePart().addRelationship(
-                pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
-
-        XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
+        XSLFPictureShape sh = getDrawing().createPicture(rp.getRelationship().getId());
         new DrawPictureShape(sh).resize();
         _shapes.add(sh);
         sh.setParent(this);
@@ -285,13 +279,10 @@ implements XSLFShapeContainer, GroupShape<XSLFShape,XSLFTextParagraph> {
         if (!(pictureData instanceof XSLFPictureData)) {
             throw new IllegalArgumentException("pictureData needs to be of type XSLFPictureData");
         }
-        XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
-        PackagePart pic = xPictureData.getPackagePart();
 
-        PackageRelationship rel = getSheet().getPackagePart().addRelationship(
-                pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
-        
-        XSLFObjectShape sh = getDrawing().createOleShape(rel.getId());
+        RelationPart rp = getSheet().addRelation(null, XSLFRelation.IMAGES, (XSLFPictureData)pictureData);
+
+        XSLFObjectShape sh = getDrawing().createOleShape(rp.getRelationship().getId());
         CTOleObject oleObj = sh.getCTOleObject();
         Dimension dim = pictureData.getImageDimension();
         oleObj.setImgW(Units.toEMU(dim.getWidth()));
index a5b80e8d6f803c67f508cd6846b7a0db3f3c2944..9df566929a1be0855dcb2324776e17cb15b241e2 100644 (file)
@@ -19,10 +19,9 @@ package org.apache.poi.xslf.usermodel;
 import java.net.URI;
 
 import org.apache.poi.common.usermodel.HyperlinkType;
+import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackagePartName;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.openxml4j.opc.TargetMode;
 import org.apache.poi.sl.usermodel.Hyperlink;
 import org.apache.poi.sl.usermodel.Slide;
 import org.apache.poi.util.Internal;
@@ -30,8 +29,8 @@ import org.apache.poi.util.Removal;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink;
 
 public class XSLFHyperlink implements Hyperlink<XSLFShape,XSLFTextParagraph> {
-    final XSLFSheet _sheet;
-    final CTHyperlink _link;
+    private final XSLFSheet _sheet;
+    private final CTHyperlink _link;
 
     XSLFHyperlink(CTHyperlink link, XSLFSheet sheet){
         _sheet = sheet;
@@ -128,14 +127,12 @@ public class XSLFHyperlink implements Hyperlink<XSLFShape,XSLFTextParagraph> {
 
     @Override
     public void linkToSlide(Slide<XSLFShape,XSLFTextParagraph> slide) {
-        PackagePart thisPP = _sheet.getPackagePart();
-        PackagePartName otherPPN = ((XSLFSheet)slide).getPackagePart().getPartName();
         if (_link.isSetId() && !_link.getId().isEmpty()) {
-            thisPP.removeRelationship(_link.getId());
+            _sheet.getPackagePart().removeRelationship(_link.getId());
         }
-        PackageRelationship rel =
-            thisPP.addRelationship(otherPPN, TargetMode.INTERNAL, XSLFRelation.SLIDE.getRelation());
-        _link.setId(rel.getId());
+
+        RelationPart rp = _sheet.addRelation(null, XSLFRelation.SLIDE, (XSLFSheet) slide);
+        _link.setId(rp.getRelationship().getId());
         _link.setAction("ppaction://hlinksldjump");
     }
 
index fcddb47ad06ed814ea72ac7a53bed86bbff6c3de..97b4ab8cb026ad604a37d6b907bd488bd92d1e28 100644 (file)
@@ -24,7 +24,6 @@ import java.net.URI;
 
 import javax.xml.namespace.QName;
 
-import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.sl.usermodel.PictureShape;
@@ -95,10 +94,7 @@ public class XSLFPictureShape extends XSLFSimpleShape
      *  (image lives outside)?
      */
     public boolean isExternalLinkedPicture() {
-        if (getBlipId() == null && getBlipLink() != null) {
-            return true;
-        }
-        return false;
+        return getBlipId() == null && getBlipLink() != null;
     }
 
     /**
@@ -108,19 +104,10 @@ public class XSLFPictureShape extends XSLFSimpleShape
     public XSLFPictureData getPictureData() {
         if(_data == null){
             String blipId = getBlipId();
-            if (blipId == null) return null;
-
-            PackagePart p = getSheet().getPackagePart();
-            PackageRelationship rel = p.getRelationship(blipId);
-            if (rel != null) {
-                try {
-                    PackagePart imgPart = p.getRelatedPart(rel);
-                    _data = new XSLFPictureData(imgPart);
-                }
-                catch (Exception e) {
-                    throw new POIXMLException(e);
-                }
+            if (blipId == null) {
+                return null;
             }
+            _data = (XSLFPictureData)getSheet().getRelationById(blipId);
         }
         return _data;
     }
@@ -181,12 +168,14 @@ public class XSLFPictureShape extends XSLFSimpleShape
         return getBlipFill().getBlip();
     }
     
+    @SuppressWarnings("WeakerAccess")
     protected String getBlipLink(){
         String link = getBlip().getLink();
         if (link.isEmpty()) return null;
         return link;
     }
-    
+
+    @SuppressWarnings("WeakerAccess")
     protected String getBlipId(){
         String id = getBlip().getEmbed();
         if (id.isEmpty()) return null;
@@ -210,7 +199,7 @@ public class XSLFPictureShape extends XSLFSimpleShape
             return;
         }
 
-        String relId = getSheet().importBlip(blipId, p.getSheet().getPackagePart());
+        String relId = getSheet().importBlip(blipId, p.getSheet());
 
         CTPicture ct = (CTPicture)getXmlObject();
         CTBlip blip = getBlipFill().getBlip();
@@ -224,13 +213,14 @@ public class XSLFPictureShape extends XSLFSimpleShape
         if(blip.isSetExtLst()) {
 
             CTOfficeArtExtensionList extLst = blip.getExtLst();
+            //noinspection deprecation
             for(CTOfficeArtExtension ext : extLst.getExtArray()){
                 String xpath = "declare namespace a14='http://schemas.microsoft.com/office/drawing/2010/main' $this//a14:imgProps/a14:imgLayer";
                 XmlObject[] obj = ext.selectPath(xpath);
                 if(obj != null && obj.length == 1){
                     XmlCursor c = obj[0].newCursor();
                     String id = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "embed"));//selectPath("declare namespace r='http://schemas.openxmlformats.org/officeDocument/2006/relationships' $this//[@embed]");
-                    String newId = getSheet().importBlip(id, p.getSheet().getPackagePart());
+                    String newId = getSheet().importBlip(id, p.getSheet());
                     c.setAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "embed"), newId);
                     c.dispose();
                 }
index ac896d7928fcdc1adefbc46e497c9ab857b4f5d5..2dbc39bff461e60b926fb8aef91505c55ba288c1 100644 (file)
@@ -18,7 +18,6 @@ package org.apache.poi.xslf.usermodel;
 
 import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
 
-import javax.xml.namespace.QName;
 import java.awt.Dimension;
 import java.awt.Graphics2D;
 import java.io.IOException;
@@ -32,9 +31,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import javax.xml.namespace.QName;
+
 import org.apache.poi.ooxml.POIXMLDocumentPart;
 import org.apache.poi.ooxml.POIXMLException;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackageNamespaces;
 import org.apache.poi.openxml4j.opc.PackagePart;
@@ -82,14 +82,14 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
 
     private final BitSet shapeIds = new BitSet();
 
-    public XSLFSheet() {
+    protected XSLFSheet() {
         super();
     }
 
     /**
      * @since POI 3.14-Beta1
      */
-    public XSLFSheet(PackagePart part) {
+    protected XSLFSheet(PackagePart part) {
         super(part);
     }
 
@@ -108,12 +108,14 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         throw new IllegalStateException("SlideShow was not found");
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected int allocateShapeId() {
         final int nextId = shapeIds.nextClearBit(1);
         shapeIds.set(nextId);
         return nextId;
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected void registerShapeId(final int shapeId) {
         if (shapeIds.get(shapeId)) {
             LOG.log(POILogger.WARN, "shape id "+shapeId+" has been already used.");
@@ -121,6 +123,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         shapeIds.set(shapeId);
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected void deregisterShapeId(final int shapeId) {
         if (!shapeIds.get(shapeId)) {
             LOG.log(POILogger.WARN, "shape id "+shapeId+" hasn't been registered.");
@@ -128,6 +131,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         shapeIds.clear(shapeId);
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected static List<XSLFShape> buildShapes(CTGroupShape spTree, XSLFShapeContainer parent){
         final XSLFSheet sheet = (parent instanceof XSLFSheet) ? (XSLFSheet)parent : ((XSLFShape)parent).getSheet();
 
@@ -261,10 +265,8 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         if (!(pictureData instanceof XSLFPictureData)) {
             throw new IllegalArgumentException("pictureData needs to be of type XSLFPictureData");
         }
-        XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
-        PackagePart pic = xPictureData.getPackagePart();
 
-        RelationPart rp = addRelation(null, XSLFRelation.IMAGES, new XSLFPictureData(pic));
+        RelationPart rp = addRelation(null, XSLFRelation.IMAGES, (XSLFPictureData)pictureData);
 
         XSLFPictureShape sh = getDrawing().createPicture(rp.getRelationship().getId());
         new DrawPictureShape(sh).resize();
@@ -303,10 +305,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         if (!(pictureData instanceof XSLFPictureData)) {
             throw new IllegalArgumentException("pictureData needs to be of type XSLFPictureData");
         }
-        XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
-        PackagePart pic = xPictureData.getPackagePart();
-
-        RelationPart rp = addRelation(null, XSLFRelation.IMAGES, new XSLFPictureData(pic));
+        RelationPart rp = addRelation(null, XSLFRelation.IMAGES, (XSLFPictureData)pictureData);
         
         XSLFObjectShape sh = getDrawing().createOleShape(rp.getRelationship().getId());
         CTOleObject oleObj = sh.getCTOleObject();
@@ -386,6 +385,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
 
     protected abstract String getRootElementName();
 
+    @SuppressWarnings("WeakerAccess")
     protected CTGroupShape getSpTree(){
         if(_spTree == null) {
             XmlObject root = getXmlObject();
@@ -460,6 +460,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
      * @param src the source sheet
      * @return modified <code>this</code>.
      */
+    @SuppressWarnings("unused")
     public XSLFSheet appendContent(XSLFSheet src){
         int numShapes = getShapes().size();
         CTGroupShape spTree = getSpTree();
@@ -523,6 +524,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         return null;
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected XSLFTextShape getTextShapeByType(Placeholder type){
         for(XSLFShape shape : this.getShapes()){
             if(shape instanceof XSLFTextShape) {
@@ -535,6 +537,7 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         return null;
     }
 
+    @SuppressWarnings("WeakerAccess")
     public XSLFSimpleShape getPlaceholder(Placeholder ph) {
         return getPlaceholderByType(ph.ooxmlId);
     }
@@ -600,19 +603,10 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
      *
      * @return all placeholder shapes in this sheet
      */
+    @SuppressWarnings("WeakerAccess")
     public XSLFTextShape[] getPlaceholders() {
         initPlaceholders();
-        return _placeholders.toArray(new XSLFTextShape[_placeholders.size()]);
-    }
-
-    /**
-     * Checks if this <code>sheet</code> displays the specified shape.
-     *
-     * Subclasses can override it and skip certain shapes from drawings,
-     * for instance, slide masters and layouts don't display placeholders
-     */
-    protected boolean canDraw(XSLFShape shape){
-        return true;
+        return _placeholders.toArray(new XSLFTextShape[0]);
     }
 
     /**
@@ -650,39 +644,35 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
      * Import a picture data from another document.
      *
      * @param blipId        ID of the package relationship to retrieve.
-     * @param packagePart   package part containing the data to import
+     * @param parent        parent document containing the data to import
      * @return ID of the created relationship
      */
-    String importBlip(String blipId, PackagePart packagePart) {
-        PackageRelationship blipRel = packagePart.getRelationship(blipId);
-        PackagePart blipPart;
-        try {
-            blipPart = packagePart.getRelatedPart(blipRel);
-        } catch (Exception e){
-            throw new POIXMLException(e);
+    String importBlip(String blipId, POIXMLDocumentPart parent) {
+        final XSLFPictureData parData = parent.getRelationPartById(blipId).getDocumentPart();
+        final XSLFPictureData pictureData;
+        if (getPackagePart().getPackage() == parent.getPackagePart().getPackage()) {
+            // handle ref counter correct, if the parent document is the same as this
+            pictureData = parData;
+        } else {
+            XMLSlideShow ppt = getSlideShow();
+            pictureData = ppt.addPicture(parData.getData(), parData.getType());
         }
-        XSLFPictureData data = new XSLFPictureData(blipPart);
-
-        XMLSlideShow ppt = getSlideShow();
-        XSLFPictureData pictureData = ppt.addPicture(data.getData(), data.getType());
-        PackagePart pic = pictureData.getPackagePart();
-
-        RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
 
+        RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, pictureData);
         return rp.getRelationship().getId();
     }
 
     /**
      * Import a package part into this sheet.
      */
-    PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
+    void importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
         PackagePart destPP = getPackagePart();
         PackagePartName srcPPName = srcPafrt.getPartName();
 
         OPCPackage pkg = destPP.getPackage();
         if(pkg.containPart(srcPPName)){
             // already exists
-            return pkg.getPart(srcPPName);
+            return;
         }
 
         destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType());
@@ -697,7 +687,6 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
         } catch (IOException e){
             throw new POIXMLException(e);
         }
-        return part;
     }
 
     /**
index 0326250dbd10ed3bf9ba6be6a74bbb0e67aee083..4e54712a778bd861adf6c8882c4b88086b82a1f3 100644 (file)
@@ -216,13 +216,13 @@ public abstract class XSLFSimpleShape extends XSLFShape
     @Override
     public boolean getFlipHorizontal() {
         CTTransform2D xfrm = getXfrm(false);
-        return (xfrm == null || !xfrm.isSetFlipH()) ? false : xfrm.getFlipH();
+        return (xfrm != null && xfrm.isSetFlipH()) && xfrm.getFlipH();
     }
 
     @Override
     public boolean getFlipVertical() {
         CTTransform2D xfrm = getXfrm(false);
-        return (xfrm == null || !xfrm.isSetFlipV()) ? false : xfrm.getFlipV();
+        return (xfrm != null && xfrm.isSetFlipV()) && xfrm.getFlipV();
     }
 
 
@@ -232,7 +232,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      *
      * @return line properties from the theme of null
      */
-    CTLineProperties getDefaultLineProperties() {
+    private CTLineProperties getDefaultLineProperties() {
         CTShapeStyle style = getSpStyle();
         if (style == null) {
             return null;
@@ -302,6 +302,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      * @return the color of the shape outline or <code>null</code>
      * if outline is turned off
      */
+    @SuppressWarnings("WeakerAccess")
     public Color getLineColor() {
         PaintStyle ps = getLinePaint();
         if (ps instanceof SolidPaint) {
@@ -310,6 +311,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
         return null;
     }
 
+    @SuppressWarnings("WeakerAccess")
     protected PaintStyle getLinePaint() {
         XSLFSheet sheet = getSheet();
         final XSLFTheme theme = sheet.getTheme();
@@ -377,6 +379,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      *
      * @param width line width in points. <code>0</code> means no line
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineWidth(double width) {
         CTLineProperties lnPr = getLn(this, true);
         if (lnPr == null) {
@@ -411,6 +414,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return line width in points. <code>0</code> means no line.
      */
+    @SuppressWarnings("WeakerAccess")
     public double getLineWidth() {
         PropertyFetcher<Double> fetcher = new PropertyFetcher<Double>() {
             @Override
@@ -451,6 +455,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @param compound set the line compound style
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineCompound(LineCompound compound) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -487,6 +492,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line compound
      */
+    @SuppressWarnings("WeakerAccess")
     public LineCompound getLineCompound() {
         PropertyFetcher<Integer> fetcher = new PropertyFetcher<Integer>() {
             @Override
@@ -531,6 +537,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      *
      * @param dash a preset line dashing scheme to stroke thr shape outline
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineDash(LineDash dash) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -549,6 +556,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return  a preset line dashing scheme to stroke the shape outline
      */
+    @SuppressWarnings("WeakerAccess")
     public LineDash getLineDash() {
 
         PropertyFetcher<LineDash> fetcher = new PropertyFetcher<LineDash>() {
@@ -579,6 +587,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      *
      * @param cap the line end cap style
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineCap(LineCap cap) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -598,6 +607,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      *
      * @return the line end cap style
      */
+    @SuppressWarnings("WeakerAccess")
     public LineCap getLineCap() {
         PropertyFetcher<LineCap> fetcher = new PropertyFetcher<LineCap>() {
             @Override
@@ -758,7 +768,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
             CTBlip blip = fp.getBlipFill().getBlip();
             String blipId = blip.getEmbed();
 
-            String relId = getSheet().importBlip(blipId, s.getSheet().getPackagePart());
+            String relId = getSheet().importBlip(blipId, s.getSheet());
             blip.setEmbed(relId);
         }
 
@@ -793,6 +803,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      * 
      * @param style the line end docoration style
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineHeadDecoration(DecorationShape style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -811,6 +822,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration shape
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationShape getLineHeadDecoration() {
         CTLineProperties ln = getLn(this, false);
         DecorationShape ds = DecorationShape.NONE;
@@ -825,6 +837,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      * 
      * @param style the decoration width 
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineHeadWidth(DecorationSize style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -843,6 +856,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration width
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationSize getLineHeadWidth() {
         CTLineProperties ln = getLn(this, false);
         DecorationSize ds = DecorationSize.MEDIUM;
@@ -855,6 +869,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * Specifies the line end width in relation to the line width.
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineHeadLength(DecorationSize style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -874,6 +889,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration length
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationSize getLineHeadLength() {
         CTLineProperties ln = getLn(this, false);
         
@@ -887,6 +903,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * Specifies the line end decoration, such as a triangle or arrowhead.
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineTailDecoration(DecorationShape style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -906,6 +923,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration shape
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationShape getLineTailDecoration() {
         CTLineProperties ln = getLn(this, false);
         
@@ -919,6 +937,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * specifies decorations which can be added to the tail of a line.
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineTailWidth(DecorationSize style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -938,6 +957,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration width
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationSize getLineTailWidth() {
         CTLineProperties ln = getLn(this, false);
         DecorationSize ds = DecorationSize.MEDIUM;
@@ -950,6 +970,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * Specifies the line end width in relation to the line width.
      */
+    @SuppressWarnings("WeakerAccess")
     public void setLineTailLength(DecorationSize style) {
         CTLineProperties ln = getLn(this, true);
         if (ln == null) {
@@ -969,6 +990,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     /**
      * @return the line end decoration length
      */
+    @SuppressWarnings("WeakerAccess")
     public DecorationSize getLineTailLength() {
         CTLineProperties ln = getLn(this, false);
         
@@ -984,6 +1006,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
         XSLFGeometryProperties gp = XSLFPropertiesDelegate.getGeometryDelegate(getShapeProperties());
         
         if (gp != null && gp.isSetPrstGeom() && gp.getPrstGeom().isSetAvLst()) {
+            //noinspection deprecation
             for (CTGeomGuide g : gp.getPrstGeom().getAvLst().getGdArray()) {
                 if (g.getName().equals(name)) {
                     return new Guide(g.getName(), g.getFmla());
@@ -1036,12 +1059,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
      */
     @Override
     public FillStyle getFillStyle() {
-        return new FillStyle() {
-            @Override
-            public PaintStyle getPaint() {
-                return XSLFSimpleShape.this.getFillPaint();
-            }
-        };
+        return XSLFSimpleShape.this::getFillPaint;
     }
 
     @Override
index 701b504a0ec251262f3b68e8c50e3bc2260ec4a8..33baa4c173d2e65db39ccb1ae04dafede9ed2b1e 100644 (file)
@@ -128,10 +128,12 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
         return "sld";
     }
 
+    @SuppressWarnings({"WeakerAccess", "ProtectedMemberInFinalClass"})
     protected void removeChartRelation(XSLFChart chart) {
         removeRelation(chart);
     }
 
+    @SuppressWarnings({"WeakerAccess", "ProtectedMemberInFinalClass"})
     protected void removeLayoutRelation(XSLFSlideLayout layout) {
         removeRelation(layout, false);
     }
@@ -164,6 +166,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
      * @return the comments part or {@code null} if there weren't any comments
      * @since POI 4.0.0
      */
+    @SuppressWarnings("WeakerAccess")
     public XSLFComments getCommentsPart() {
         if(_comments == null) {
             for (POIXMLDocumentPart p : getRelations()) {
@@ -181,6 +184,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
      * @return the comment authors part or {@code null} if there weren't any comments
      * @since POI 4.0.0
      */
+    @SuppressWarnings("WeakerAccess")
     public XSLFCommentAuthors getCommentAuthorsPart() {
         if(_commentAuthors == null) {
             // first scan the slide relations
@@ -209,6 +213,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
         final XSLFComments xComments = getCommentsPart();
         final XSLFCommentAuthors xAuthors = getCommentAuthorsPart();
         if (xComments != null) {
+            //noinspection deprecation
             for (final CTComment xc : xComments.getCTCommentsList().getCmArray()) {
                 comments.add(new XSLFComment(xc, xAuthors));
             }
@@ -268,6 +273,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
      *
      * @param value whether shapes on the master slide should be shown or not.
      */
+    @SuppressWarnings("WeakerAccess")
     public void setFollowMasterGraphics(boolean value){
         _slide.setShowMasterSp(value);
     }
@@ -310,7 +316,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
 
         if(bgOther.isSetBgPr() && bgOther.getBgPr().isSetBlipFill()){
             String idOther = bgOther.getBgPr().getBlipFill().getBlip().getEmbed();
-            String idThis = importBlip(idOther, src.getPackagePart());
+            String idThis = importBlip(idOther, src);
             bgThis.getBgPr().getBlipFill().getBlip().setEmbed(idThis);
 
         }
@@ -358,7 +364,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
     /**
      * Render this sheet into the supplied graphics object
      *
-     * @param graphics
+     * @param graphics the graphics context to draw to
      */
     @Override
     public void draw(Graphics2D graphics){
index 7fd6bed4e8c2df06cf7c3e349dd7bb055fd9255e..569c6c248917e367ff873e97f497037ad06fe60c 100644 (file)
@@ -70,6 +70,7 @@ implements MasterSheet<XSLFShape,XSLFTextParagraph> {
      * @return slide master. Never null.
      * @throws IllegalStateException if slide master was not found
      */
+    @SuppressWarnings("WeakerAccess")
     public XSLFSlideMaster getSlideMaster() {
         if (_master == null) {
             for (POIXMLDocumentPart p : getRelations()) {
@@ -100,15 +101,6 @@ implements MasterSheet<XSLFShape,XSLFTextParagraph> {
         return _layout.getShowMasterSp();
     }
 
-    /**
-     * Render this sheet into the supplied graphics object
-     */
-    @Override
-    protected boolean canDraw(XSLFShape shape) {
-        return !(shape instanceof XSLFSimpleShape) || !shape.isPlaceholder();
-    }
-
-
     @Override
     public XSLFBackground getBackground() {
         CTBackground bg = _layout.getCSld().getBg();
@@ -124,6 +116,7 @@ implements MasterSheet<XSLFShape,XSLFTextParagraph> {
      *
      * @param slide destination slide
      */
+    @SuppressWarnings("WeakerAccess")
     public void copyLayout(XSLFSlide slide) {
         for (XSLFShape sh : getShapes()) {
             if (sh instanceof XSLFTextShape) {
index 0d029ea6d21509eefb61b3e2019e537b90cbdc8b..558e6b5cdad091f3c14aaf99b25019de1bd6064b 100644 (file)
@@ -153,15 +153,6 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
         return props;
     }
 
-    /**
-     * Render this sheet into the supplied graphics object
-     *
-     */
-    @Override
-    protected boolean canDraw(XSLFShape shape) {
-        return !(shape instanceof XSLFSimpleShape) || !shape.isPlaceholder();
-    }
-
     @Override
     public XSLFBackground getBackground() {
         CTBackground bg = _slide.getCSld().getBg();
index 38f8a7c140a79d4cf504eeefa1e6644972104e07..91c0fb4a27cc56661f514ed3677d49422b35835e 100644 (file)
@@ -32,6 +32,7 @@ import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -59,8 +60,10 @@ import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
 import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;
 import org.apache.poi.sl.usermodel.PictureData;
 import org.apache.poi.sl.usermodel.PictureData.PictureType;
+import org.apache.poi.sl.usermodel.PictureShape;
 import org.apache.poi.sl.usermodel.Shape;
 import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.sl.usermodel.Slide;
 import org.apache.poi.sl.usermodel.VerticalAlignment;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.xslf.usermodel.XMLSlideShow;
@@ -89,6 +92,57 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
 public class TestXSLFBugs {
     private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
+    @Test
+    public void bug62587() throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            Slide slide = ppt.createSlide();
+            XSLFPictureData pd = ppt.addPicture(slTests.getFile("wrench.emf"), PictureType.EMF);
+            PictureShape ps = slide.createPicture(pd);
+            ps.setAnchor(new Rectangle2D.Double(100,100,100,100));
+            ppt.write(bos);
+        }
+
+        Object[][] pics = {
+            {"santa.wmf", PictureType.WMF, XSLFRelation.IMAGE_WMF},
+            {"tomcat.png",PictureType.PNG, XSLFRelation.IMAGE_PNG},
+            {"clock.jpg", PictureType.JPEG, XSLFRelation.IMAGE_JPEG}
+        };
+
+        try (XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(bos.toByteArray()))) {
+            XSLFSlide s1 = ppt.getSlides().get(0);
+
+            for (Object[] p : pics) {
+                XSLFSlide s2 = ppt.createSlide();
+                s2.importContent(s1);
+
+                XSLFPictureData pd = ppt.addPicture(slTests.getFile((String)p[0]), (PictureType)p[1]);
+                XSLFPictureShape ps = (XSLFPictureShape) s2.getShapes().get(0);
+                Rectangle2D anchor = ps.getAnchor();
+                s2.removeShape(ps);
+                ps = s2.createPicture(pd);
+                ps.setAnchor(anchor);
+            }
+
+            bos.reset();
+            ppt.write(bos);
+        }
+
+        try (XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(bos.toByteArray()))) {
+            for (XSLFSlide sl : ppt.getSlides()) {
+                List<RelationPart> rels = sl.getRelationParts();
+                assertEquals(2, rels.size());
+                RelationPart rel0 = rels.get(0);
+                assertEquals("rId1", rel0.getRelationship().getId());
+                assertEquals(XSLFRelation.SLIDE_LAYOUT.getRelation(), rel0.getRelationship().getRelationshipType());
+                RelationPart rel1 = rels.get(1);
+                assertEquals("rId2", rel1.getRelationship().getId());
+                assertEquals(XSLFRelation.IMAGES.getRelation(), rel1.getRelationship().getRelationshipType());
+            }
+        }
+    }
+
+
     @Test
     public void bug60499() throws IOException, InvalidFormatException {
         InputStream is = slTests.openResourceAsStream("bug60499.pptx");
@@ -314,8 +368,8 @@ public class TestXSLFBugs {
         ss.close();
     }
 
-    protected String getSlideText(XMLSlideShow ppt, XSLFSlide slide) throws IOException {
-        try (SlideShowExtractor extr = new SlideShowExtractor(ppt)) {
+    private String getSlideText(XMLSlideShow ppt, XSLFSlide slide) throws IOException {
+        try (SlideShowExtractor<XSLFShape,XSLFTextParagraph> extr = new SlideShowExtractor<>(ppt)) {
             // do not auto-close the slideshow
             extr.setFilesystem(null);
             extr.setSlidesByDefault(true);
@@ -369,7 +423,12 @@ public class TestXSLFBugs {
         assertEquals(1, slide.getShapes().size());
 
         assertEquals(1, slide.getRelations().size());
-        assertRelationEquals(XSLFRelation.SLIDE_LAYOUT, slide.getRelations().get(0));
+
+        final XSLFRelation expected = XSLFRelation.SLIDE_LAYOUT;
+        final POIXMLDocumentPart relation = slide.getRelations().get(0);
+
+        assertEquals(expected.getContentType(), relation.getPackagePart().getContentType());
+        assertEquals(expected.getFileName(expected.getFileNameIndex(relation)), relation.getPackagePart().getPartName().getName());
 
         // Some dummy pictures
         byte[][] pics = new byte[15][3];
@@ -472,11 +531,6 @@ public class TestXSLFBugs {
         }
     }
 
-    private void assertRelationEquals(XSLFRelation expected, POIXMLDocumentPart relation) {
-        assertEquals(expected.getContentType(), relation.getPackagePart().getContentType());
-        assertEquals(expected.getFileName(expected.getFileNameIndex(relation)), relation.getPackagePart().getPartName().getName());
-    }
-
     @Test
     public void bug58205() throws IOException {
         XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("themes.pptx");
@@ -726,25 +780,19 @@ public class TestXSLFBugs {
 
     @Test
     public void testAptia() throws IOException {
-        XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("aptia.pptx");
-        try {
-            XMLSlideShow saved = XSLFTestDataSamples.writeOutAndReadBack(ppt);
-        } catch (IOException e) {
-            fail("Could not read back saved presentation.");
+        try (XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("aptia.pptx");
+             XMLSlideShow saved = XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+            assertEquals(ppt.getSlides().size(), saved.getSlides().size());
         }
-        ppt.close();
     }
 
     @Ignore
     @Test
     public void testDivinoRevelado() throws IOException {
-        XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("Divino_Revelado.pptx");
-        try {
-            XMLSlideShow saved = XSLFTestDataSamples.writeOutAndReadBack(ppt);
-        } catch (IOException e) {
-            fail("Could not read back saved presentation.");
+        try (XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("Divino_Revelado.pptx");
+             XMLSlideShow saved = XSLFTestDataSamples.writeOutAndReadBack(ppt)){
+            assertEquals(ppt.getSlides().size(), saved.getSlides().size());
         }
-        ppt.close();
     }
 
     @Test