From 5b902b4562c845ba3bbbfbdc994299f1a3db9d1f Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 9 Mar 2008 14:21:34 +0000 Subject: [PATCH] Get the powerpoint ooxml stuff converted over, and fix up a few tests git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@635243 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/poi/POIXMLDocument.java | 55 +++++++++++++++- .../xslf/{HSLFXML.java => XSLFSlideShow.java} | 66 ++++++++++++------- ...ctor.java => XSLFPowerPointExtractor.java} | 30 ++++----- ...SLFXMLSlideShow.java => XMLSlideShow.java} | 21 +++--- .../org/apache/poi/TestDetectAsOOXML.java | 10 +-- ...estHSLFXML.java => TestXSLFSlideShow.java} | 30 ++++----- .../extractor/TestHXFPowerPointExtractor.java | 2 +- 7 files changed, 137 insertions(+), 77 deletions(-) rename src/ooxml/java/org/apache/poi/xslf/{HSLFXML.java => XSLFSlideShow.java} (78%) rename src/ooxml/java/org/apache/poi/xslf/extractor/{HXFPowerPointExtractor.java => XSLFPowerPointExtractor.java} (83%) rename src/ooxml/java/org/apache/poi/xslf/usermodel/{HSLFXMLSlideShow.java => XMLSlideShow.java} (77%) rename src/ooxml/testcases/org/apache/poi/xslf/{TestHSLFXML.java => TestXSLFSlideShow.java} (87%) diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocument.java b/src/ooxml/java/org/apache/poi/POIXMLDocument.java index 36f195eeb1..4e190d7e77 100644 --- a/src/ooxml/java/org/apache/poi/POIXMLDocument.java +++ b/src/ooxml/java/org/apache/poi/POIXMLDocument.java @@ -22,15 +22,19 @@ import java.io.PushbackInputStream; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.IOUtils; +import org.apache.xmlbeans.XmlException; import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.exceptions.OpenXML4JException; import org.openxml4j.opc.Package; import org.openxml4j.opc.PackagePart; import org.openxml4j.opc.PackagePartName; import org.openxml4j.opc.PackageRelationship; +import org.openxml4j.opc.PackageRelationshipCollection; import org.openxml4j.opc.PackageRelationshipTypes; import org.openxml4j.opc.PackagingURIHelper; - +import org.openxml4j.opc.internal.PackagePropertiesPart; +import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties; +import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument; public abstract class POIXMLDocument { @@ -68,7 +72,7 @@ public abstract class POIXMLDocument { * in the event of a problem. * Works around shortcomings in java's this() constructor calls */ - protected static Package openPackage(String path) throws IOException { + public static Package openPackage(String path) throws IOException { try { return Package.open(path); } catch (InvalidFormatException e) { @@ -99,6 +103,27 @@ public abstract class POIXMLDocument { } return part; } + + /** + * Fetches the (single) PackagePart which is defined as + * the supplied relation content type of the base + * container, or null if none found. + * @param relationType The relation content type to search for + * @throws IllegalArgumentException If we find more than one part of that type + */ + protected PackagePart getSinglePartByRelationType(String relationType) throws IllegalArgumentException, OpenXML4JException { + PackageRelationshipCollection rels = + getCorePart().getRelationshipsByType(relationType); + if(rels.size() == 0) { + return null; + } + if(rels.size() > 1) { + throw new IllegalArgumentException("Found " + rels.size() + " relations for the type " + relationType + ", should only ever be one!"); + } + PackageRelationship rel = rels.getRelationship(0); + return getTargetPart(rel); + } + /** * Checks that the supplied InputStream (which MUST @@ -132,4 +157,30 @@ public abstract class POIXMLDocument { header[3] == POIFSConstants.OOXML_FILE_HEADER[3] ); } + + /** + * Get the core document properties (core ooxml properties). + * TODO: Replace with nice usermodel wrapper + * @deprecated To be replaced with a proper user-model style view of the properties + */ + public PackagePropertiesPart getCoreProperties() throws OpenXML4JException, IOException { + PackagePart propsPart = getSinglePartByRelationType(CORE_PROPERTIES_REL_TYPE); + if(propsPart == null) { + return null; + } + return (PackagePropertiesPart)propsPart; + } + + /** + * Get the extended document properties (extended ooxml properties) + * TODO: Replace with nice usermodel wrapper + * @deprecated To be replaced with a proper user-model style view of the properties + */ + public CTProperties getExtendedProperties() throws OpenXML4JException, XmlException, IOException { + PackagePart propsPart = getSinglePartByRelationType(EXTENDED_PROPERTIES_REL_TYPE); + + PropertiesDocument props = PropertiesDocument.Factory.parse( + propsPart.getInputStream()); + return props.getProperties(); + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/HSLFXML.java b/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java similarity index 78% rename from src/ooxml/java/org/apache/poi/xslf/HSLFXML.java rename to src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java index 568cb80aa0..fbdf00b01b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/HSLFXML.java +++ b/src/ooxml/java/org/apache/poi/xslf/XSLFSlideShow.java @@ -14,11 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ -package org.apache.poi.hslf; +package org.apache.poi.xslf; import java.io.IOException; -import org.apache.poi.hxf.HXFDocument; +import org.apache.poi.POIXMLDocument; import org.apache.xmlbeans.XmlException; import org.openxml4j.exceptions.InvalidFormatException; import org.openxml4j.exceptions.OpenXML4JException; @@ -49,7 +49,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument; * * WARNING - APIs expected to change rapidly */ -public class HSLFXML extends HXFDocument { +public class XSLFSlideShow extends POIXMLDocument { public static final String MAIN_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"; public static final String NOTES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"; public static final String SLIDE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slide+xml"; @@ -58,11 +58,14 @@ public class HSLFXML extends HXFDocument { private PresentationDocument presentationDoc; - public HSLFXML(Package container) throws OpenXML4JException, IOException, XmlException { - super(container, MAIN_CONTENT_TYPE); + public XSLFSlideShow(Package container) throws OpenXML4JException, IOException, XmlException { + super(container); presentationDoc = - PresentationDocument.Factory.parse(basePart.getInputStream()); + PresentationDocument.Factory.parse(getCorePart().getInputStream()); + } + public XSLFSlideShow(String file) throws OpenXML4JException, IOException, XmlException { + this(openPackage(file)); } /** @@ -96,11 +99,16 @@ public class HSLFXML extends HXFDocument { * the supplied slide master reference */ public CTSlideMaster getSlideMaster(CTSlideMasterIdListEntry master) throws IOException, XmlException { - PackagePart masterPart = - getRelatedPackagePart(master.getId2()); - SldMasterDocument masterDoc = - SldMasterDocument.Factory.parse(masterPart.getInputStream()); - return masterDoc.getSldMaster(); + try { + PackagePart masterPart = + getTargetPart(getCorePart().getRelationship(master.getId2())); + + SldMasterDocument masterDoc = + SldMasterDocument.Factory.parse(masterPart.getInputStream()); + return masterDoc.getSldMaster(); + } catch(InvalidFormatException e) { + throw new XmlException(e); + } } /** @@ -108,11 +116,15 @@ public class HSLFXML extends HXFDocument { * the supplied slide reference */ public CTSlide getSlide(CTSlideIdListEntry slide) throws IOException, XmlException { - PackagePart slidePart = - getRelatedPackagePart(slide.getId2()); - SldDocument slideDoc = - SldDocument.Factory.parse(slidePart.getInputStream()); - return slideDoc.getSld(); + try { + PackagePart slidePart = + getTargetPart(getCorePart().getRelationship(slide.getId2())); + SldDocument slideDoc = + SldDocument.Factory.parse(slidePart.getInputStream()); + return slideDoc.getSld(); + } catch(InvalidFormatException e) { + throw new XmlException(e); + } } /** @@ -120,11 +132,11 @@ public class HSLFXML extends HXFDocument { * slide, as found from the supplied slide reference */ public CTNotesSlide getNotes(CTSlideIdListEntry slide) throws IOException, XmlException { - PackagePart slidePart = - getRelatedPackagePart(slide.getId2()); - PackageRelationshipCollection notes; try { + PackagePart slidePart = + getTargetPart(getCorePart().getRelationship(slide.getId2())); + notes = slidePart.getRelationshipsByType(NOTES_RELATION_TYPE); } catch(InvalidFormatException e) { throw new IllegalStateException(e); @@ -138,11 +150,15 @@ public class HSLFXML extends HXFDocument { throw new IllegalStateException("Expecting 0 or 1 notes for a slide, but found " + notes.size()); } - PackagePart notesPart = - getPackagePart(notes.getRelationship(0)); - NotesDocument notesDoc = - NotesDocument.Factory.parse(notesPart.getInputStream()); - - return notesDoc.getNotes(); + try { + PackagePart notesPart = + getTargetPart(notes.getRelationship(0)); + NotesDocument notesDoc = + NotesDocument.Factory.parse(notesPart.getInputStream()); + + return notesDoc.getNotes(); + } catch(InvalidFormatException e) { + throw new IllegalStateException(e); + } } } diff --git a/src/ooxml/java/org/apache/poi/xslf/extractor/HXFPowerPointExtractor.java b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java similarity index 83% rename from src/ooxml/java/org/apache/poi/xslf/extractor/HXFPowerPointExtractor.java rename to src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java index bfa59e32cd..0f28c2fdc0 100644 --- a/src/ooxml/java/org/apache/poi/xslf/extractor/HXFPowerPointExtractor.java +++ b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java @@ -14,15 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.extractor; +package org.apache.poi.xslf.extractor; import java.io.File; import java.io.IOException; +import org.apache.poi.POIXMLDocument; import org.apache.poi.POIXMLTextExtractor; -import org.apache.poi.hslf.HSLFXML; -import org.apache.poi.hslf.usermodel.HSLFXMLSlideShow; -import org.apache.poi.hxf.HXFDocument; +import org.apache.poi.xslf.XSLFSlideShow; import org.apache.xmlbeans.XmlException; import org.openxml4j.exceptions.OpenXML4JException; import org.openxml4j.opc.Package; @@ -35,17 +34,15 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; -public class HXFPowerPointExtractor extends POIXMLTextExtractor { - private HSLFXMLSlideShow slideshow; +public class XSLFPowerPointExtractor extends POIXMLTextExtractor { + private XSLFSlideShow slideshow; private boolean slidesByDefault = true; private boolean notesByDefault = false; - public HXFPowerPointExtractor(Package container) throws XmlException, OpenXML4JException, IOException { - this(new HSLFXMLSlideShow( - new XSLFXML(container) - )); + public XSLFPowerPointExtractor(Package container) throws XmlException, OpenXML4JException, IOException { + this(new XSLFSlideShow(container)); } - public HXFPowerPointExtractor(HSLFXMLSlideShow slideshow) { + public XSLFPowerPointExtractor(XSLFSlideShow slideshow) { super(slideshow); this.slideshow = slideshow; } @@ -57,9 +54,8 @@ public class HXFPowerPointExtractor extends POIXMLTextExtractor { System.exit(1); } POIXMLTextExtractor extractor = - new HXFPowerPointExtractor(HXFDocument.openPackage( - new File(args[0]) - )); + new XSLFPowerPointExtractor( + new XSLFSlideShow(args[0])); System.out.println(extractor.getText()); } @@ -94,13 +90,13 @@ public class HXFPowerPointExtractor extends POIXMLTextExtractor { StringBuffer text = new StringBuffer(); CTSlideIdListEntry[] slideRefs = - slideshow._getHSLFXML().getSlideReferences().getSldIdArray(); + slideshow.getSlideReferences().getSldIdArray(); for (int i = 0; i < slideRefs.length; i++) { try { CTSlide slide = - slideshow._getHSLFXML().getSlide(slideRefs[i]); + slideshow.getSlide(slideRefs[i]); CTNotesSlide notes = - slideshow._getHSLFXML().getNotes(slideRefs[i]); + slideshow.getNotes(slideRefs[i]); if(slideText) { extractText(slide.getCSld().getSpTree(), text); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/HSLFXMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java similarity index 77% rename from src/ooxml/java/org/apache/poi/xslf/usermodel/HSLFXMLSlideShow.java rename to src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index f4360bfff5..5bc1cf8737 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/HSLFXMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -14,10 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.usermodel; +package org.apache.poi.xslf.usermodel; -import org.apache.poi.POIXMLDocument; -import org.apache.poi.hslf.HSLFXML; +import org.apache.poi.xslf.XSLFSlideShow; /** * High level representation of a ooxml slideshow. @@ -25,15 +24,17 @@ import org.apache.poi.hslf.HSLFXML; * they are reading or writing a slideshow. It is also the * top level object for creating new slides/etc. */ -public class HSLFXMLSlideShow extends POIXMLDocument { - private org.apache.poi.hslf.XSLFXML hslfXML; +public class XMLSlideShow { + private XSLFSlideShow slideShow; - public HSLFXMLSlideShow(XSLFXML xml) { - super(xml); - this.hslfXML = xml; + public XMLSlideShow(XSLFSlideShow xml) { + this.slideShow = xml; } - public XSLFXML _getHSLFXML() { - return hslfXML; + public XSLFSlideShow _getXSLFSlideShow() { + return slideShow; } + + // TODO: Get slides + // TODO: Get notes } diff --git a/src/ooxml/testcases/org/apache/poi/TestDetectAsOOXML.java b/src/ooxml/testcases/org/apache/poi/TestDetectAsOOXML.java index 36adb497cd..dca593c3c7 100644 --- a/src/ooxml/testcases/org/apache/poi/TestDetectAsOOXML.java +++ b/src/ooxml/testcases/org/apache/poi/TestDetectAsOOXML.java @@ -17,7 +17,7 @@ ==================================================================== */ -package org.apache.poi.hxf; +package org.apache.poi; import junit.framework.TestCase; import java.io.*; @@ -38,7 +38,7 @@ public class TestDetectAsOOXML extends TestCase { File f = new File(dirname + "/sample.xlsx"); - HXFDocument.openPackage(f); + POIXMLDocument.openPackage(f.toString()); } public void testDetectAsPOIFS() throws Exception { @@ -48,18 +48,18 @@ public class TestDetectAsOOXML extends TestCase in = new PushbackInputStream( new FileInputStream(dirname + "/SampleSS.xlsx"), 10 ); - assertTrue(HXFDocument.hasOOXMLHeader(in)); + assertTrue(POIXMLDocument.hasOOXMLHeader(in)); // xls file isn't in = new PushbackInputStream( new FileInputStream(dirname + "/SampleSS.xls"), 10 ); - assertFalse(HXFDocument.hasOOXMLHeader(in)); + assertFalse(POIXMLDocument.hasOOXMLHeader(in)); // text file isn't in = new PushbackInputStream( new FileInputStream(dirname + "/SampleSS.txt"), 10 ); - assertFalse(HXFDocument.hasOOXMLHeader(in)); + assertFalse(POIXMLDocument.hasOOXMLHeader(in)); } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestHSLFXML.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFSlideShow.java similarity index 87% rename from src/ooxml/testcases/org/apache/poi/xslf/TestHSLFXML.java rename to src/ooxml/testcases/org/apache/poi/xslf/TestXSLFSlideShow.java index fd4653a854..c25d08a90c 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestHSLFXML.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFSlideShow.java @@ -14,11 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ -package org.apache.poi.hslf; +package org.apache.poi.xslf; import java.io.File; -import org.apache.poi.hxf.HXFDocument; +import org.apache.poi.POIXMLDocument; import org.openxml4j.opc.Package; import org.openxml4j.opc.PackagePart; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry; @@ -26,8 +26,8 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMasterIdListE import junit.framework.TestCase; -public class TestHSLFXML extends TestCase { - private File sampleFile; +public class TestXSLFSlideShow extends TestCase { + private String sampleFile; protected void setUp() throws Exception { super.setUp(); @@ -35,15 +35,15 @@ public class TestHSLFXML extends TestCase { sampleFile = new File( System.getProperty("HSLF.testdata.path") + File.separator + "sample.pptx" - ); + ).toString(); } public void testContainsMainContentType() throws Exception { - Package pack = HXFDocument.openPackage(sampleFile); + Package pack = POIXMLDocument.openPackage(sampleFile); boolean found = false; for(PackagePart part : pack.getParts()) { - if(part.getContentType().equals(HSLFXML.MAIN_CONTENT_TYPE)) { + if(part.getContentType().equals(XSLFSlideShow.MAIN_CONTENT_TYPE)) { found = true; } System.out.println(part); @@ -52,13 +52,13 @@ public class TestHSLFXML extends TestCase { } public void testOpen() throws Exception { - HXFDocument.openPackage(sampleFile); + POIXMLDocument.openPackage(sampleFile); - HSLFXML xml; + XSLFSlideShow xml; // With the finalised uri, should be fine - xml = new HSLFXML( - HXFDocument.openPackage(sampleFile) + xml = new XSLFSlideShow( + POIXMLDocument.openPackage(sampleFile) ); // Check the core @@ -74,9 +74,7 @@ public class TestHSLFXML extends TestCase { } public void testSlideBasics() throws Exception { - HSLFXML xml = new HSLFXML( - HXFDocument.openPackage(sampleFile) - ); + XSLFSlideShow xml = new XSLFSlideShow(sampleFile); // Should have 1 master assertEquals(1, xml.getSlideMasterReferences().sizeOfSldMasterIdArray()); @@ -110,9 +108,7 @@ public class TestHSLFXML extends TestCase { } public void testMetadataBasics() throws Exception { - HSLFXML xml = new HSLFXML( - HXFDocument.openPackage(sampleFile) - ); + XSLFSlideShow xml = new XSLFSlideShow(sampleFile); assertNotNull(xml.getCoreProperties()); assertNotNull(xml.getExtendedProperties()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestHXFPowerPointExtractor.java b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestHXFPowerPointExtractor.java index 6a006ab5c8..3b2ba0746a 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestHXFPowerPointExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestHXFPowerPointExtractor.java @@ -49,7 +49,7 @@ public class TestHXFPowerPointExtractor extends TestCase { */ public void testGetSimpleText() throws Exception { new HXFPowerPointExtractor(xmlA.getPackage()); - new HXFPowerPointExtractor(new HSLFXMLSlideShow(xmlA)); + new HXFPowerPointExtractor(new XMLSlideShow(xmlA)); HXFPowerPointExtractor extractor = new HXFPowerPointExtractor(xmlA.getPackage()); -- 2.39.5