From: PJ Fanning Date: Sun, 29 Jul 2018 23:05:01 +0000 (+0000) Subject: Handle NPE issues in POIXMLProperties X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3be215e070d334f3bf22669e6e82bfee075c0465;p=poi.git Handle NPE issues in POIXMLProperties git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1837007 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java b/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java index 27b398d8a4..31dac6a468 100644 --- a/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java +++ b/src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java @@ -68,17 +68,20 @@ public class POIXMLProperties { this.pkg = docPackage; // Core properties - core = new CoreProperties((PackagePropertiesPart)pkg.getPackageProperties() ); + core = new CoreProperties((PackagePropertiesPart)pkg.getPackageProperties()); // Extended properties PackageRelationshipCollection extRel = pkg.getRelationshipsByType(PackageRelationshipTypes.EXTENDED_PROPERTIES); if(extRel.size() == 1) { - extPart = pkg.getPart( extRel.getRelationship(0)); - org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument.Factory.parse( - extPart.getInputStream(), DEFAULT_XML_OPTIONS - ); - ext = new ExtendedProperties(props); + extPart = pkg.getPart(extRel.getRelationship(0)); + if (extPart == null) { + ext = new ExtendedProperties((org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument)NEW_EXT_INSTANCE.copy()); + } else { + org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument.Factory.parse( + extPart.getInputStream(), DEFAULT_XML_OPTIONS); + ext = new ExtendedProperties(props); + } } else { extPart = null; ext = new ExtendedProperties((org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument)NEW_EXT_INSTANCE.copy()); @@ -88,11 +91,14 @@ public class POIXMLProperties { PackageRelationshipCollection custRel = pkg.getRelationshipsByType(PackageRelationshipTypes.CUSTOM_PROPERTIES); if(custRel.size() == 1) { - custPart = pkg.getPart( custRel.getRelationship(0)); - org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument.Factory.parse( - custPart.getInputStream(), DEFAULT_XML_OPTIONS - ); - cust = new CustomProperties(props); + custPart = pkg.getPart(custRel.getRelationship(0)); + if (custPart == null) { + cust = new CustomProperties((org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument)NEW_CUST_INSTANCE.copy()); + } else { + org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument.Factory.parse( + custPart.getInputStream(), DEFAULT_XML_OPTIONS); + cust = new CustomProperties(props); + } } else { custPart = null; cust = new CustomProperties((org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument)NEW_CUST_INSTANCE.copy()); @@ -197,9 +203,9 @@ public class POIXMLProperties { * @throws IOException if the properties can't be saved * @throws POIXMLException if the properties are erroneous */ - public void commit() throws IOException{ + public void commit() throws IOException { - if(extPart == null && !NEW_EXT_INSTANCE.toString().equals(ext.props.toString())){ + if(extPart == null && ext != null && ext.props != null && !NEW_EXT_INSTANCE.toString().equals(ext.props.toString())){ try { PackagePartName prtname = PackagingURIHelper.createPartName("/docProps/app.xml"); pkg.addRelationship(prtname, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"); @@ -208,7 +214,7 @@ public class POIXMLProperties { throw new POIXMLException(e); } } - if(custPart == null && !NEW_CUST_INSTANCE.toString().equals(cust.props.toString())){ + if(custPart == null && cust != null && cust.props != null && !NEW_CUST_INSTANCE.toString().equals(cust.props.toString())){ try { PackagePartName prtname = PackagingURIHelper.createPartName("/docProps/custom.xml"); pkg.addRelationship(prtname, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties"); @@ -218,17 +224,17 @@ public class POIXMLProperties { } } if(extPart != null){ - OutputStream out = extPart.getOutputStream(); - if (extPart.getSize() > 0) { - extPart.clear(); + try (OutputStream out = extPart.getOutputStream()) { + if (extPart.getSize() > 0) { + extPart.clear(); + } + ext.props.save(out, DEFAULT_XML_OPTIONS); } - ext.props.save(out, DEFAULT_XML_OPTIONS); - out.close(); } if(custPart != null){ - OutputStream out = custPart.getOutputStream(); - cust.props.save(out, DEFAULT_XML_OPTIONS); - out.close(); + try (OutputStream out = custPart.getOutputStream()) { + cust.props.save(out, DEFAULT_XML_OPTIONS); + } } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 64f69a0221..a57b3025d4 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -724,6 +724,18 @@ public class TestXSLFBugs { 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."); + } + ppt.close(); + } + @Test public void bug62051() throws IOException { final Function, int[]> ids = (shapes) -> diff --git a/test-data/slideshow/Divino_Revelado.pptx b/test-data/slideshow/Divino_Revelado.pptx new file mode 100644 index 0000000000..fa22e69c8a Binary files /dev/null and b/test-data/slideshow/Divino_Revelado.pptx differ