You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2018/09/26 21:42:21 UTC

svn commit: r1842055 - in /poi/trunk: src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java test-data/slideshow/bug62736.pptx

Author: fanningpj
Date: Wed Sep 26 21:42:21 2018
New Revision: 1842055

URL: http://svn.apache.org/viewvc?rev=1842055&view=rev
Log:
[bug-62736] Relations on XSLFPictureShape are removed unconditionally. Thanks to Mate Borcsok

Added:
    poi/trunk/test-data/slideshow/bug62736.pptx   (with props)
Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java?rev=1842055&r1=1842054&r2=1842055&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java Wed Sep 26 21:42:21 2018
@@ -692,10 +692,23 @@ implements XSLFShapeContainer, Sheet<XSL
     /**
      * Helper method for sheet and group shapes
      *
-     * @param pictureShape the picture shapes whose relation is to be removed
+     * @param pictureShape the picture shapes whose relation is to be removed,
+     *                     only if there are no more relations on its sheet to that picture
      */
     void removePictureRelation(XSLFPictureShape pictureShape) {
-        removeRelation(pictureShape.getBlipId());
+        int numberOfRelations = 0;
+        String targetBlipId = pictureShape.getBlipId();
+        for (XSLFShape shape : pictureShape.getSheet().getShapes()) {
+            if (shape instanceof XSLFPictureShape) {
+                XSLFPictureShape currentPictureShape = ((XSLFPictureShape) shape);
+                if (currentPictureShape.getBlipId().equals(targetBlipId)) {
+                    numberOfRelations++;
+                }
+            }
+        }
+        if (numberOfRelations <= 1) {
+            removeRelation(pictureShape.getBlipId());
+        }
     }
 
 

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java?rev=1842055&r1=1842054&r2=1842055&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java Wed Sep 26 21:42:21 2018
@@ -93,6 +93,87 @@ import org.openxmlformats.schemas.presen
 public class TestXSLFBugs {
     private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
+    @Test
+    public void bug62736() throws Exception {
+        XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("bug62736.pptx");
+
+        assertEquals(1, ss1.getSlides().size());
+
+        XSLFSlide slide0 = ss1.getSlides().get(0);
+
+        assertEquals(slide0.getShapes().size(), 4);
+
+        assertRelation(slide0, "/ppt/slides/slide1.xml", null);
+        assertRelation(slide0, "/ppt/slideLayouts/slideLayout1.xml", "rId1");
+        assertRelation(slide0, "/ppt/media/image1.png", "rId2");
+        assertEquals(slide0.getRelations().size(), 2);
+
+        List<XSLFPictureShape> pictures = new ArrayList<>();
+        for (XSLFShape shape : slide0.getShapes()) {
+            if (shape instanceof XSLFPictureShape) {
+                pictures.add((XSLFPictureShape) shape);
+            }
+        }
+
+        assertEquals(pictures.size(), 2);
+        assertEquals(pictures.get(0).getPictureData().getFileName(), "image1.png");
+        assertEquals(pictures.get(1).getPictureData().getFileName(), "image1.png");
+        // blipId is rId2 of both pictures
+
+        // remove just the first picture
+        slide0.removeShape(pictures.get(0));
+
+        assertEquals(slide0.getShapes().size(), 3);
+
+        assertRelation(slide0, "/ppt/slides/slide1.xml", null);
+        assertRelation(slide0, "/ppt/slideLayouts/slideLayout1.xml", "rId1");
+        // the bug is that the following relation is gone
+        assertRelation(slide0, "/ppt/media/image1.png", "rId2");
+        assertEquals(slide0.getRelations().size(), 2);
+
+        // Save and re-load
+        XMLSlideShow ss2 = XSLFTestDataSamples.writeOutAndReadBack(ss1);
+        ss1.close();
+        assertEquals(1, ss2.getSlides().size());
+
+        slide0 = ss2.getSlides().get(0);
+
+        assertRelation(slide0, "/ppt/slides/slide1.xml", null);
+        assertRelation(slide0, "/ppt/slideLayouts/slideLayout1.xml", "rId1");
+        assertRelation(slide0, "/ppt/media/image1.png", "rId2");
+        assertEquals(slide0.getRelations().size(), 2);
+
+        pictures.clear();
+        for (XSLFShape shape : slide0.getShapes()) {
+            if (shape instanceof XSLFPictureShape) {
+                pictures.add((XSLFPictureShape) shape);
+            }
+        }
+
+        assertEquals(pictures.size(), 1);
+        assertEquals(pictures.get(0).getPictureData().getFileName(), "image1.png");
+
+        slide0.removeShape(pictures.get(0));
+
+        assertEquals(slide0.getShapes().size(), 2);
+
+        assertRelation(slide0, "/ppt/slides/slide1.xml", null);
+        assertRelation(slide0, "/ppt/slideLayouts/slideLayout1.xml", "rId1");
+        assertNull(slide0.getRelationById("rId2"));
+        assertEquals(slide0.getRelations().size(), 1);
+
+        // Save and re-load
+        XMLSlideShow ss3 = XSLFTestDataSamples.writeOutAndReadBack(ss2);
+        ss2.close();
+        assertEquals(1, ss3.getSlides().size());
+
+        slide0 = ss3.getSlides().get(0);
+
+        assertRelation(slide0, "/ppt/slides/slide1.xml", null);
+        assertRelation(slide0, "/ppt/slideLayouts/slideLayout1.xml", "rId1");
+        assertEquals(slide0.getShapes().size(), 2);
+        ss3.close();
+    }
 
     @Test
     public void bug61589() throws IOException {

Added: poi/trunk/test-data/slideshow/bug62736.pptx
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/slideshow/bug62736.pptx?rev=1842055&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/slideshow/bug62736.pptx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Wed Sep 26 21:42:21 2018
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.presentationml.presentation



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org