diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 131aa9059..668242048 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -65,6 +65,7 @@ public class XMLSlideShow extends POIXMLDocument { private List _slides; private Map _masters; private XSLFNotesMaster _notesMaster; + private XSLFCommentAuthors _commentAuthors; protected List _pictures; public XMLSlideShow() { @@ -125,6 +126,8 @@ public class XMLSlideShow extends POIXMLDocument { _masters.put(p.getPackageRelationship().getId(), master); } else if (p instanceof XSLFNotesMaster) { _notesMaster = (XSLFNotesMaster)p; + } else if (p instanceof XSLFCommentAuthors) { + _commentAuthors = (XSLFCommentAuthors)p; } } @@ -219,6 +222,10 @@ public class XMLSlideShow extends POIXMLDocument { return slide; } + /** + * Return the Notes Master, if there is one. + * (May not be present if no notes exist) + */ public XSLFNotesMaster getNotesMaster() { return _notesMaster; } @@ -233,6 +240,14 @@ public class XMLSlideShow extends POIXMLDocument { public XSLFSlide[] getSlides() { return _slides.toArray(new XSLFSlide[_slides.size()]); } + + /** + * Returns the list of comment authors, if there is one. + * Will only be present if at least one slide has comments on it. + */ + public XSLFCommentAuthors getCommentAuthors() { + return _commentAuthors; + } /** * diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java new file mode 100644 index 000000000..231dc008d --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java @@ -0,0 +1,73 @@ +/* ==================================================================== + 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.xslf.usermodel; + +import java.io.IOException; + +import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.util.Beta; +import org.apache.xmlbeans.XmlException; +import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentAuthor; +import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentAuthorList; +import org.openxmlformats.schemas.presentationml.x2006.main.CmAuthorLstDocument; + +@Beta +public class XSLFCommentAuthors extends POIXMLDocumentPart { + private final CTCommentAuthorList _authors; + + /** + * Create a new set of slide comments + */ + XSLFCommentAuthors() { + super(); + CmAuthorLstDocument doc = CmAuthorLstDocument.Factory.newInstance(); + _authors = doc.addNewCmAuthorLst(); + } + + /** + * Construct a SpreadsheetML slide authors from a package part + * + * @param part the package part holding the comment authors data, + * the content type must be application/vnd.openxmlformats-officedocument.commentAuthors+xml + * @param rel the package relationship holding this comment authors, + * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors + */ + XSLFCommentAuthors(PackagePart part, PackageRelationship rel) throws IOException, XmlException { + super(part, rel); + + CmAuthorLstDocument doc = + CmAuthorLstDocument.Factory.parse(getPackagePart().getInputStream()); + _authors = doc.getCmAuthorLst(); + } + + public CTCommentAuthorList getCTCommentAuthorsList() { + return _authors; + } + + public CTCommentAuthor getAuthorById(long id) { + // TODO Have a map + for (CTCommentAuthor author : _authors.getCmAuthorList()) { + if (author.getId() == id) { + return author; + } + } + return null; + } +} diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java index 430b1fad6..35e884658 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java @@ -24,6 +24,7 @@ import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; +import org.openxmlformats.schemas.presentationml.x2006.main.CTComment; import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentList; import org.openxmlformats.schemas.presentationml.x2006.main.CmLstDocument; @@ -59,4 +60,12 @@ public class XSLFComments extends POIXMLDocumentPart { public CTCommentList getCTCommentsList() { return _comments; } + + public int getNumberOfComments() { + return _comments.sizeOfCmArray(); + } + + public CTComment getCommentAt(int pos) { + return _comments.getCmList().get(pos); + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java index 7993d09c2..0d691e44d 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java @@ -112,6 +112,13 @@ public class XSLFRelation extends POIXMLRelation { XSLFComments.class ); + public static final XSLFRelation COMMENT_AUTHORS = new XSLFRelation( + "application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors", + "/ppt/commentAuthors.xml", + XSLFCommentAuthors.class + ); + public static final XSLFRelation HYPERLINK = new XSLFRelation( null, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java index fd18db1e6..61eb7cd0a 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java @@ -119,4 +119,43 @@ public class TestXMLSlideShow extends TestCase { assertEquals(null, xml.getProperties().getCoreProperties().getTitle()); assertEquals(null, xml.getProperties().getCoreProperties().getUnderlyingProperties().getSubjectProperty().getValue()); } + + public void testComments() throws Exception { + // Default sample file has none + XMLSlideShow xml = new XMLSlideShow(pack); + + assertEquals(null, xml.getCommentAuthors()); + + for (XSLFSlide slide : xml.getSlides()) { + assertEquals(null, slide.getComments()); + } + + // Try another with comments + OPCPackage packComments = OPCPackage.open(slTests.openResourceAsStream("45545_Comment.pptx")); + XMLSlideShow xmlComments = new XMLSlideShow(packComments); + + // Has one author + assertNotNull(xmlComments.getCommentAuthors()); + assertEquals(1, xmlComments.getCommentAuthors().getCTCommentAuthorsList().sizeOfCmAuthorArray()); + assertEquals("XPVMWARE01", xmlComments.getCommentAuthors().getAuthorById(0).getName()); + + // First two slides have comments + for (int i=0; i