Author: fanningpj
Date: Sun Aug 28 09:35:48 2022
New Revision: 1903727

URL: http://svn.apache.org/viewvc?rev=1903727&view=rev
Log:
[bug-66242] Fix issue with orphaned (in package) images and notes post slide 
removal. Thanks to gffloodg. This closes #377

Modified:
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java?rev=1903727&r1=1903726&r2=1903727&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
 Sun Aug 28 09:35:48 2022
@@ -190,7 +190,7 @@ public class XMLSlideShow extends POIXML
             _masters.clear();
             if (_presentation.isSetSldMasterIdLst()) {
                 _presentation.getSldMasterIdLst().getSldMasterIdList().forEach(
-                   id -> _masters.add(masterMap.get(id.getId2()))
+                        id -> _masters.add(masterMap.get(id.getId2()))
                 );
             }
 
@@ -248,10 +248,10 @@ public class XMLSlideShow extends POIXML
      */
     public XSLFSlide createSlide(XSLFSlideLayout layout) {
         CTSlideIdList slideList = _presentation.isSetSldIdLst()
-            ? _presentation.getSldIdLst() : _presentation.addNewSldIdLst();
+                ? _presentation.getSldIdLst() : _presentation.addNewSldIdLst();
 
         OptionalLong maxId = Stream.of(slideList.getSldIdArray())
-            .mapToLong(CTSlideIdListEntry::getId).max();
+                .mapToLong(CTSlideIdListEntry::getId).max();
 
         final XSLFRelation relationType = XSLFRelation.SLIDE;
         final int slideNumber = (int)(Math.max(maxId.orElse(0),255)+1);
@@ -466,6 +466,15 @@ public class XMLSlideShow extends POIXML
         sldIdLst.setSldIdArray(entries);
     }
 
+    /**
+     * Remove a slide from this presentation.
+     *
+     * @param index The slide number to remove.
+     * @return The slide that was removed.
+     *
+     * @throws RuntimeException a number of runtime exceptions can be thrown, 
especially if there are problems with the
+     * input format
+     */
     public XSLFSlide removeSlide(int index) {
         XSLFSlide slide = _slides.remove(index);
         removeRelation(slide);
@@ -478,11 +487,38 @@ public class XMLSlideShow extends POIXML
             } else if (p instanceof XSLFSlideLayout) {
                 XSLFSlideLayout layout = (XSLFSlideLayout) p;
                 slide.removeLayoutRelation(layout);
+            } else if (p instanceof XSLFNotes) {
+                XSLFNotes notes = slide.removeNotes(_notesMaster);
+                removeRelation(notes);
+            } else if (p instanceof XSLFPictureData) {
+                XSLFPictureData picture = (XSLFPictureData) p;
+                removePictureRelations(slide, picture);
+                _pictures.remove(picture);
             }
         }
         return slide;
     }
 
+    private void removePictureRelations(XSLFSlide slide, XSLFPictureData 
picture) {
+        removePictureRelations(slide, slide, picture);
+    }
+
+    private void removePictureRelations(XSLFSlide slide, XSLFShapeContainer 
container, XSLFPictureData picture) {
+        for (XSLFShape shape : container.getShapes()) {
+            // Find either group shapes (and recurse) ...
+            if (shape instanceof XSLFGroupShape) {
+                removePictureRelations(slide, (XSLFGroupShape)shape, picture);
+            }
+            // ... or the picture shape with this picture data and remove it's 
relation to the picture data.
+            if (shape instanceof XSLFPictureShape) {
+                XSLFPictureShape pic = (XSLFPictureShape) shape;
+                if (pic.getPictureData() == picture) {
+                    slide.removePictureRelation(pic);
+                }
+            }
+        }
+    }
+
     @Override
     public Dimension getPageSize() {
         CTSlideSize sz = _presentation.getSldSz();

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFNotes.java?rev=1903727&r1=1903726&r2=1903727&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFNotes.java 
(original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFNotes.java 
Sun Aug 28 09:35:48 2022
@@ -111,4 +111,9 @@ implements Notes<XSLFShape,XSLFTextParag
     String mapSchemeColor(String schemeColor) {
         return mapSchemeColor(_notes.getClrMapOvr(), schemeColor);
     }
+
+    void removeRelations(XSLFSlide slide, XSLFNotesMaster master) {
+        super.removeRelation(slide);
+        super.removeRelation(master);
+    }
 }

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSlide.java?rev=1903727&r1=1903726&r2=1903727&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSlide.java 
(original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSlide.java 
Sun Aug 28 09:35:48 2022
@@ -239,6 +239,21 @@ implements Slide<XSLFShape,XSLFTextParag
         return _notes;
     }
 
+    public XSLFNotes removeNotes(XSLFNotesMaster master) {
+        XSLFNotes notesForSlide = getNotes();
+        if (notesForSlide == null) {
+            // No notes to remove.
+            return null;
+        }
+
+        notesForSlide.removeRelations(this, master);
+        removeRelation(notesForSlide);
+
+        _notes = null;
+
+        return notesForSlide;
+    }
+
     @Override
     public String getTitle(){
         XSLFTextShape txt = getTextShapeByType(Placeholder.TITLE);

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java?rev=1903727&r1=1903726&r2=1903727&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
 Sun Aug 28 09:35:48 2022
@@ -21,126 +21,310 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertSame;
 
 import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.sl.usermodel.Placeholder;
 import org.apache.poi.xslf.XSLFTestDataSamples;
 import org.junit.jupiter.api.Test;
 
 class TestXSLFSlideShow {
     @Test
     void testCreateSlide() throws IOException {
-        XMLSlideShow  ppt = new XMLSlideShow();
-        assertEquals(0, ppt.getSlides().size());
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            assertEquals(0, ppt.getSlides().size());
 
-        XSLFSlide slide1 = ppt.createSlide();
-        assertEquals(1, ppt.getSlides().size());
-        assertSame(slide1, ppt.getSlides().get(0));
-
-        List<POIXMLDocumentPart> rels =  slide1.getRelations();
-        assertEquals(1, rels.size());
-        assertEquals(slide1.getSlideMaster().getLayout(SlideLayout.BLANK), 
rels.get(0));
-
-        XSLFSlide slide2 = ppt.createSlide();
-        assertEquals(2, ppt.getSlides().size());
-        assertSame(slide2, ppt.getSlides().get(1));
-
-        ppt.setSlideOrder(slide2, 0);
-        assertSame(slide2, ppt.getSlides().get(0));
-        assertSame(slide1, ppt.getSlides().get(1));
-
-        XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt);
-        assertEquals(2, ppt2.getSlides().size());
-        rels =  ppt2.getSlides().get(0).getRelations();
-
-        ppt2.close();
-        ppt.close();
+            XSLFSlide slide1 = ppt.createSlide();
+            assertEquals(1, ppt.getSlides().size());
+            assertSame(slide1, ppt.getSlides().get(0));
+
+            List<POIXMLDocumentPart> rels =  slide1.getRelations();
+            assertEquals(1, rels.size());
+            assertEquals(slide1.getSlideMaster().getLayout(SlideLayout.BLANK), 
rels.get(0));
+
+            XSLFSlide slide2 = ppt.createSlide();
+            assertEquals(2, ppt.getSlides().size());
+            assertSame(slide2, ppt.getSlides().get(1));
+
+            ppt.setSlideOrder(slide2, 0);
+            assertSame(slide2, ppt.getSlides().get(0));
+            assertSame(slide1, ppt.getSlides().get(1));
+
+            try (XMLSlideShow ppt2 = 
XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+                assertEquals(2, ppt2.getSlides().size());
+                rels = ppt2.getSlides().get(0).getRelations();
+                assertNotNull(rels);
+            }
+        }
     }
 
     @Test
     void testRemoveSlide() throws IOException {
-        XMLSlideShow  ppt = new XMLSlideShow();
-        assertEquals(0, ppt.getSlides().size());
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            assertEquals(0, ppt.getSlides().size());
 
-        XSLFSlide slide1 = ppt.createSlide();
-        XSLFSlide slide2 = ppt.createSlide();
+            XSLFSlide slide1 = ppt.createSlide();
+            XSLFSlide slide2 = ppt.createSlide();
 
-        assertEquals(2, ppt.getSlides().size());
-        assertSame(slide1, ppt.getSlides().get(0));
-        assertSame(slide2, ppt.getSlides().get(1));
+            assertEquals(2, ppt.getSlides().size());
+            assertSame(slide1, ppt.getSlides().get(0));
+            assertSame(slide2, ppt.getSlides().get(1));
+
+            XSLFSlide removedSlide = ppt.removeSlide(0);
+            assertSame(slide1, removedSlide);
+
+            assertEquals(1, ppt.getSlides().size());
+            assertSame(slide2, ppt.getSlides().get(0));
+
+            try (XMLSlideShow ppt2 = 
XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+                assertEquals(1, ppt2.getSlides().size());
+
+                // Check that the slide is actually removed from the package.
+                String slidePartRegEx = "/ppt/slides/slide[0-9]+\\.xml";
+                List<PackagePart> slideParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(slidePartRegEx));
+                assertEquals(1, slideParts.size());
+            }
+        }
+    }
 
-        XSLFSlide removedSlide = ppt.removeSlide(0);
-        assertSame(slide1, removedSlide);
 
-        assertEquals(1, ppt.getSlides().size());
-        assertSame(slide2, ppt.getSlides().get(0));
+    /**
+     * This test ensures that if a slide (with notes) is removed, that it
+     * is ACTUALLY removed (including the notes), and not left orphaned
+     * when the PPTX is later written.
+     *
+     * @throws IOException If there is an I/O issue during the test.
+     */
+    @Test
+    void testRemoveSlideThatHasNotes() throws IOException {
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            assertEquals(0, ppt.getSlides().size());
+
+            XSLFSlide slide1 = ppt.createSlide();
+            XSLFSlide slide2 = ppt.createSlide();
+
+            XSLFNotes note = ppt.getNotesSlide(slide1);
+            for (XSLFTextShape shape : note.getPlaceholders()) {
+                if (shape.getTextType() == Placeholder.BODY) {
+                    shape.setText("Some notes");
+                    break;
+                }
+            }
+
+            assertEquals(2, ppt.getSlides().size());
+            assertSame(slide1, ppt.getSlides().get(0));
+            assertSame(slide2, ppt.getSlides().get(1));
+
+            XSLFSlide removedSlide = ppt.removeSlide(0);
+            assertSame(slide1, removedSlide);
+
+            assertEquals(1, ppt.getSlides().size());
+            assertSame(slide2, ppt.getSlides().get(0));
+
+            try (XMLSlideShow ppt2 = 
XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+                assertEquals(1, ppt2.getSlides().size());
+
+                // Check that the slide is actually removed from the package.
+                String slidePartRegEx = "/ppt/slides/slide[0-9]+\\.xml";
+                List<PackagePart> slideParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(slidePartRegEx));
+                assertEquals(1, slideParts.size());
+
+                // Check that there is no note slide part.
+                String notePartRegEx = 
"/ppt/notesSlides/notesSlide[0-9]+\\.xml";
+                List<PackagePart> noteParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(notePartRegEx));
+                assertEquals(0, noteParts.size());
+            }
+        }
+    }
 
-        XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt);
-        assertEquals(1, ppt2.getSlides().size());
 
-        ppt2.close();
-        ppt.close();
+    /**
+     * This test ensures that if a slide (with notes and images) is removed, 
that it
+     * is ACTUALLY removed (including the notes and images), and not left 
orphaned
+     * when the PPTX is later written.
+     *
+     * @throws IOException If there is an I/O issue during the test.
+     */
+    @Test
+    void testRemoveSlideThatHasNotesAndImages() throws IOException {
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            assertEquals(0, ppt.getSlides().size());
+
+            XSLFSlide slide1 = ppt.createSlide();
+            XSLFSlide slide2 = ppt.createSlide();
+
+            // NOTE: This image is INVALID but this doesnt matter for THIS 
test.
+            XSLFPictureData pictData = ppt.addPicture(
+                    new ByteArrayInputStream(new byte[] { 00, 01, 02 }), 
PictureData.PictureType.PNG);
+            XSLFPictureShape picShape = slide1.createPicture(pictData);
+            picShape.setAnchor(new Rectangle(10, 10, 200, 100));
+
+            XSLFNotes note = ppt.getNotesSlide(slide1);
+            for (XSLFTextShape shape : note.getPlaceholders()) {
+                if (shape.getTextType() == Placeholder.BODY) {
+                    shape.setText("Some notes");
+                    break;
+                }
+            }
+
+            assertEquals(2, ppt.getSlides().size());
+            assertSame(slide1, ppt.getSlides().get(0));
+            assertSame(slide2, ppt.getSlides().get(1));
+
+            XSLFSlide removedSlide = ppt.removeSlide(0);
+            assertSame(slide1, removedSlide);
+
+            assertEquals(1, ppt.getSlides().size());
+            assertSame(slide2, ppt.getSlides().get(0));
+
+            try (XMLSlideShow ppt2 = 
XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+                assertEquals(1, ppt2.getSlides().size());
+
+                // Check that the slide is actually removed from the package.
+                String slidePartRegEx = "/ppt/slides/slide[0-9]+\\.xml";
+                List<PackagePart> slideParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(slidePartRegEx));
+                assertEquals(1, slideParts.size());
+
+                // Check that there is no note slide part.
+                String notePartRegEx = 
"/ppt/notesSlides/notesSlide[0-9]+\\.xml";
+                List<PackagePart> noteParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(notePartRegEx));
+                assertEquals(0, noteParts.size());
+
+                // Check that there is no image slide part.
+                String imagePartRegEx = "/ppt/media/image[0-9]+\\.png";
+                List<PackagePart> imageParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(imagePartRegEx));
+                assertEquals(0, imageParts.size());
+            }
+        }
+    }
+
+    /**
+     * This test ensures that if a slide (with notes and images [inside a 
group])
+     * is removed, that it is ACTUALLY removed (including the notes and 
images),
+     * and not left orphaned when the PPTX is later written.
+     *
+     * @throws IOException If there is an I/O issue during the test.
+     */
+    @Test
+    void testRemoveSlideThatHasNotesAndImagesInsideAGroup() throws IOException 
{
+        try (XMLSlideShow  ppt = new XMLSlideShow()) {
+            assertEquals(0, ppt.getSlides().size());
+
+            XSLFSlide slide1 = ppt.createSlide();
+            XSLFSlide slide2 = ppt.createSlide();
+
+            XSLFGroupShape group = slide1.createGroup();
+
+            // NOTE: This image is INVALID but this doesnt matter for THIS 
test.
+            XSLFPictureData pictData = ppt.addPicture(
+                    new ByteArrayInputStream(new byte[] { 00, 01, 02 }), 
PictureData.PictureType.PNG);
+            XSLFPictureShape picShape = group.createPicture(pictData);
+            picShape.setAnchor(new Rectangle(10, 10, 200, 100));
+
+            XSLFNotes note = ppt.getNotesSlide(slide1);
+            for (XSLFTextShape shape : note.getPlaceholders()) {
+                if (shape.getTextType() == Placeholder.BODY) {
+                    shape.setText("Some notes");
+                    break;
+                }
+            }
+
+            assertEquals(2, ppt.getSlides().size());
+            assertSame(slide1, ppt.getSlides().get(0));
+            assertSame(slide2, ppt.getSlides().get(1));
+
+            XSLFSlide removedSlide = ppt.removeSlide(0);
+            assertSame(slide1, removedSlide);
+
+            assertEquals(1, ppt.getSlides().size());
+            assertSame(slide2, ppt.getSlides().get(0));
+
+            try (XMLSlideShow ppt2 = 
XSLFTestDataSamples.writeOutAndReadBack(ppt)) {
+                assertEquals(1, ppt2.getSlides().size());
+
+                // Check that the slide is actually removed from the package.
+                String slidePartRegEx = "/ppt/slides/slide[0-9]+\\.xml";
+                List<PackagePart> slideParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(slidePartRegEx));
+                assertEquals(1, slideParts.size());
+
+                // Check that there is no note slide part.
+                String notePartRegEx = 
"/ppt/notesSlides/notesSlide[0-9]+\\.xml";
+                List<PackagePart> noteParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(notePartRegEx));
+                assertEquals(0, noteParts.size());
+
+                // Check that there is no image slide part.
+                String imagePartRegEx = "/ppt/media/image[0-9]+\\.png";
+                List<PackagePart> imageParts = 
ppt2.getPackage().getPartsByName(Pattern.compile(imagePartRegEx));
+                imageParts.forEach(System.out::println);
+                assertEquals(0, imageParts.size());
+            }
+        }
     }
 
     @Test
     void testDimension() throws IOException {
-        XMLSlideShow  ppt = new XMLSlideShow();
-        Dimension sz = ppt.getPageSize();
-        assertEquals(720, sz.width);
-        assertEquals(540, sz.height);
-        ppt.setPageSize(new Dimension(792, 612));
-        sz = ppt.getPageSize();
-        assertEquals(792, sz.width);
-        assertEquals(612, sz.height);
-        ppt.close();
+        try (XMLSlideShow  ppt = new XMLSlideShow()) {
+            Dimension sz = ppt.getPageSize();
+            assertEquals(720, sz.width);
+            assertEquals(540, sz.height);
+            ppt.setPageSize(new Dimension(792, 612));
+            sz = ppt.getPageSize();
+            assertEquals(792, sz.width);
+            assertEquals(612, sz.height);
+        }
     }
 
     @Test
     void testSlideMasters() throws IOException {
-        XMLSlideShow  ppt = new XMLSlideShow();
-        List<XSLFSlideMaster> masters = ppt.getSlideMasters();
-        assertEquals(1, masters.size());
-
-        XSLFSlide slide = ppt.createSlide();
-        assertSame(masters.get(0), slide.getSlideMaster());
-        ppt.close();
+        try (XMLSlideShow  ppt = new XMLSlideShow()) {
+            List<XSLFSlideMaster> masters = ppt.getSlideMasters();
+            assertEquals(1, masters.size());
+
+            XSLFSlide slide = ppt.createSlide();
+            assertSame(masters.get(0), slide.getSlideMaster());
+        }
     }
 
     @Test
     void testSlideLayout() throws IOException {
-        XMLSlideShow  ppt = new XMLSlideShow();
-        List<XSLFSlideMaster> masters = ppt.getSlideMasters();
-        assertEquals(1, masters.size());
-
-        XSLFSlide slide = ppt.createSlide();
-        XSLFSlideLayout layout = slide.getSlideLayout();
-        assertNotNull(layout);
+        try (XMLSlideShow  ppt = new XMLSlideShow()) {
+            List<XSLFSlideMaster> masters = ppt.getSlideMasters();
+            assertEquals(1, masters.size());
+
+            XSLFSlide slide = ppt.createSlide();
+            XSLFSlideLayout layout = slide.getSlideLayout();
+            assertNotNull(layout);
 
-        assertSame(masters.get(0), layout.getSlideMaster());
-        ppt.close();
+            assertSame(masters.get(0), layout.getSlideMaster());
+        }
     }
 
     @Test
     void testSlideLayoutNames() throws IOException {
         final String[] names = {
-                "Blank", "Title Only", "Section Header", "Picture with 
Caption", "Title and Content"
-                , "Title Slide", "Title and Vertical Text", "Vertical Title 
and Text", "Comparison"
-                , "Two Content", "Content with Caption"
-        };
-        XMLSlideShow ppt = 
XSLFTestDataSamples.openSampleDocument("layouts.pptx");
-        for (String name : names) {
-            assertNotNull(ppt.findLayout(name));
-        }
-        final SlideLayout[] layTypes = {
-                SlideLayout.BLANK, SlideLayout.TITLE_ONLY, 
SlideLayout.SECTION_HEADER
-                , SlideLayout.PIC_TX, SlideLayout.TITLE_AND_CONTENT, 
SlideLayout.TITLE
-                , SlideLayout.VERT_TX, SlideLayout.VERT_TITLE_AND_TX, 
SlideLayout.TWO_TX_TWO_OBJ
-                , SlideLayout.TWO_OBJ, SlideLayout.OBJ_TX
+                "Blank", "Title Only", "Section Header", "Picture with 
Caption", "Title and Content",
+                "Title Slide", "Title and Vertical Text", "Vertical Title and 
Text", "Comparison",
+                "Two Content", "Content with Caption"
         };
-        for (SlideLayout sl : layTypes){
-            assertNotNull(ppt.getSlideMasters().get(0).getLayout(sl));
+        try (XMLSlideShow ppt = 
XSLFTestDataSamples.openSampleDocument("layouts.pptx")) {
+            for (String name : names) {
+                assertNotNull(ppt.findLayout(name));
+            }
+            final SlideLayout[] layTypes = {
+                    SlideLayout.BLANK, SlideLayout.TITLE_ONLY, 
SlideLayout.SECTION_HEADER,
+                    SlideLayout.PIC_TX, SlideLayout.TITLE_AND_CONTENT, 
SlideLayout.TITLE,
+                    SlideLayout.VERT_TX, SlideLayout.VERT_TITLE_AND_TX, 
SlideLayout.TWO_TX_TWO_OBJ,
+                    SlideLayout.TWO_OBJ, SlideLayout.OBJ_TX
+            };
+            for (SlideLayout sl : layTypes){
+                assertNotNull(ppt.getSlideMasters().get(0).getLayout(sl));
+            }
         }
-        ppt.close();
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to