You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2018/03/27 09:20:53 UTC

svn commit: r1827818 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java

Author: msahyoun
Date: Tue Mar 27 09:20:52 2018
New Revision: 1827818

URL: http://svn.apache.org/viewvc?rev=1827818&view=rev
Log:
PDFBOX-4158: try closing all open IO ressources even if there is an error when closing one of these

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java?rev=1827818&r1=1827817&r2=1827818&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java Tue Mar 27 09:20:52 2018
@@ -427,24 +427,75 @@ public class COSDocument extends COSBase
     {
         if (!closed)
         {
+            // Make sure that:
+            // - first Exception is kept
+            // - all COSStreams are closed
+            // - ScratchFile is closed
+            // - there's a way to see which errors occured
+
+            IOException firstException = null;
+
             // close all open I/O streams
             for (COSObject object : getObjects())
             {
                 COSBase cosObject = object.getObject();
                 if (cosObject instanceof COSStream)
                 {
-                    ((COSStream) cosObject).close();
+                    COSStream cosStream = (COSStream) cosObject;
+                    try
+                    {
+                        cosStream.close();
+                    }
+                    catch (IOException ioe)
+                    {
+                        LOG.warn("Error closing COSStream", ioe);
+                        if (firstException == null)
+                        {
+                            firstException = ioe;
+                        }
+
+                    } 
                 }
             }
             for (COSStream stream : streams)
             {
-                stream.close();
+                try
+                {
+                    stream.close();
+                }
+                catch (IOException ioe)
+                {
+                    LOG.warn("Error closing COSStream", ioe);
+                    if (firstException == null)
+                    {
+                        firstException = ioe;
+                    }
+
+                }
             }
             if (scratchFile != null)
             {
-                scratchFile.close();
+                try
+                {
+                    scratchFile.close();
+                }
+                catch (IOException ioe)
+                {
+                    LOG.warn("Error closing ScratchFile", ioe);
+                    if (firstException == null)
+                    {
+                        firstException = ioe;
+                    }
+
+                }
             }
             closed = true;
+
+            // rethrow first exception to keep method contract
+            if (firstException != null)
+            {
+                throw firstException;
+            }
         }
     }