From d3fb77384384eeb0029642fa3e6c631184e54b83 Mon Sep 17 00:00:00 2001 From: Javen O'Neal Date: Wed, 14 Sep 2016 13:55:39 +0000 Subject: [PATCH] bug 60128: close opened resources to avoid leaks; add exception as cause where available for more context for raised exceptions. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1760710 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/openxml4j/opc/ZipPackage.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java index 8f7efa02c5..e2f4c8e707 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java @@ -53,6 +53,9 @@ import org.apache.poi.util.TempFile; * Physical zip package. */ public final class ZipPackage extends OPCPackage { + private static final String MIMETYPE = "mimetype"; + private static final String SETTINGS_XML = "settings.xml"; + private static POILogger logger = POILogFactory.getLogger(ZipPackage.class); /** @@ -191,7 +194,7 @@ public final class ZipPackage extends OPCPackage { } catch (final IOException e2) { throw new InvalidOperationException("Failed to read the zip entry source stream and could not close the zip input stream", e2); } - throw new InvalidOperationException("Failed to read the zip entry source stream"); + throw new InvalidOperationException("Failed to read the zip entry source stream", e); } } @@ -253,7 +256,7 @@ public final class ZipPackage extends OPCPackage { this.contentTypeManager = new ZipContentTypeManager( getZipArchive().getInputStream(entry), this); } catch (IOException e) { - throw new InvalidFormatException(e.getMessage()); + throw new InvalidFormatException(e.getMessage(), e); } break; } @@ -269,10 +272,10 @@ public final class ZipPackage extends OPCPackage { while (entries.hasMoreElements()) { final ZipEntry entry = entries.nextElement(); final String name = entry.getName(); - if ("mimetype".equals(name)) { + if (MIMETYPE.equals(name)) { hasMimetype = true; } - if ("settings.xml".equals(name)) { + if (SETTINGS_XML.equals(name)) { hasSettingsXML = true; } numEntries++; @@ -307,10 +310,10 @@ public final class ZipPackage extends OPCPackage { String contentType = contentTypeManager.getContentType(partName); if (contentType != null && contentType.equals(ContentTypes.RELATIONSHIPS_PART)) { try { - partList.put(partName, new ZipPackagePart(this, entry, - partName, contentType)); + PackagePart part = new ZipPackagePart(this, entry, partName, contentType); + partList.put(partName, part); } catch (InvalidOperationException e) { - throw new InvalidFormatException(e.getMessage()); + throw new InvalidFormatException(e.getMessage(), e); } } } @@ -322,17 +325,16 @@ public final class ZipPackage extends OPCPackage { PackagePartName partName = buildPartName(entry); if(partName == null) continue; - String contentType = contentTypeManager - .getContentType(partName); + String contentType = contentTypeManager.getContentType(partName); if (contentType != null && contentType.equals(ContentTypes.RELATIONSHIPS_PART)) { // Already handled } else if (contentType != null) { try { - partList.put(partName, new ZipPackagePart(this, entry, - partName, contentType)); + PackagePart part = new ZipPackagePart(this, entry, partName, contentType); + partList.put(partName, part); } catch (InvalidOperationException e) { - throw new InvalidFormatException(e.getMessage()); + throw new InvalidFormatException(e.getMessage(), e); } } else { throw new InvalidFormatException( @@ -440,20 +442,22 @@ public final class ZipPackage extends OPCPackage { // Save the final package to a temporary file try { save(tempFile); - - // Close the current zip file, so we can - // overwrite it on all platforms - this.zipArchive.close(); - // Copy the new file over the old one - FileHelper.copyFile(tempFile, targetFile); } finally { - // Either the save operation succeed or not, we delete the - // temporary file - if (!tempFile.delete()) { - logger - .log(POILogger.WARN,"The temporary file: '" - + targetFile.getAbsolutePath() - + "' cannot be deleted ! Make sure that no other application use it."); + try { + // Close the current zip file, so we can + // overwrite it on all platforms + this.zipArchive.close(); + // Copy the new file over the old one + FileHelper.copyFile(tempFile, targetFile); + } finally { + // Either the save operation succeed or not, we delete the + // temporary file + if (!tempFile.delete()) { + logger + .log(POILogger.WARN,"The temporary file: '" + + targetFile.getAbsolutePath() + + "' cannot be deleted ! Make sure that no other application use it."); + } } } } else {