]> source.dussan.org Git - poi.git/commitdiff
Handle NPE issues in POIXMLProperties
authorPJ Fanning <fanningpj@apache.org>
Sun, 29 Jul 2018 23:05:01 +0000 (23:05 +0000)
committerPJ Fanning <fanningpj@apache.org>
Sun, 29 Jul 2018 23:05:01 +0000 (23:05 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1837007 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/ooxml/POIXMLProperties.java
src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
test-data/slideshow/Divino_Revelado.pptx [new file with mode: 0644]

index 27b398d8a428f2c85b943e1d4fa1a4f88c486aca..31dac6a468bd13bc22fb54726074e5008cc252ff 100644 (file)
@@ -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);
+            }
         }
     }
 
index 64f69a02215f91ab8df9f6bf7366cd1eefb3cc6d..a57b3025d421a117d9f5f0922291e6390f96772f 100644 (file)
@@ -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<List<XSLFShape>, int[]> ids = (shapes) ->
diff --git a/test-data/slideshow/Divino_Revelado.pptx b/test-data/slideshow/Divino_Revelado.pptx
new file mode 100644 (file)
index 0000000..fa22e69
Binary files /dev/null and b/test-data/slideshow/Divino_Revelado.pptx differ