You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/12/22 19:53:34 UTC

svn commit: r1553018 - in /pdfbox/branches/1.8: ./ pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java

Author: lehmi
Date: Sun Dec 22 18:53:34 2013
New Revision: 1553018

URL: http://svn.apache.org/r1553018
Log:
PDFBOX-1777: release/close all resources based on a proposal by Robert Scharpf

Modified:
    pdfbox/branches/1.8/   (props changed)
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java

Propchange: pdfbox/branches/1.8/
------------------------------------------------------------------------------
  Merged /pdfbox/trunk:r1553017

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java?rev=1553018&r1=1553017&r2=1553018&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java Sun Dec 22 18:53:34 2013
@@ -40,7 +40,7 @@ import org.apache.pdfbox.persistence.uti
  * close() on this object when you are done using it!!
  *
  * @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.28 $
+ * 
  */
 public class COSDocument extends COSBase
 {
@@ -566,6 +566,35 @@ public class COSDocument extends COSBase
             {
                 tmpFile.delete();
             }
+            if (trailer != null)
+            {
+            	trailer.clear();
+            	trailer = null;
+            }
+            // Clear object pool
+            List<COSObject> list = getObjects();
+            if (list != null && !list.isEmpty()) 
+            {
+                for (COSObject object : list) 
+                {
+                    COSBase cosObject = object.getObject();
+                    // clear the resources of the pooled objects
+                    if (cosObject instanceof COSStream)
+                    {
+                    	((COSStream)cosObject).close();
+                    }
+                    else if (cosObject instanceof COSDictionary)
+                    {
+                    	((COSDictionary)cosObject).clear();
+                    }
+                    else if (cosObject instanceof COSArray)
+                    {
+                    	((COSArray)cosObject).clear();
+                    }
+                    // TODO are there other kind of COSObjects to be cleared?
+                }
+                list.clear();
+            }
             closed = true;
         }
     }

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java?rev=1553018&r1=1553017&r2=1553018&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java Sun Dec 22 18:53:34 2013
@@ -24,6 +24,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.List;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.filter.Filter;
 import org.apache.pdfbox.filter.FilterManager;
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
@@ -41,6 +43,11 @@ import org.apache.pdfbox.io.RandomAccess
  */
 public class COSStream extends COSDictionary
 {
+    /**
+     * Log instance.
+     */
+    private static final Log LOG = LogFactory.getLog(COSStream.class);
+
     private static final int BUFFER_SIZE=16384;
 
     private RandomAccess file;
@@ -273,6 +280,7 @@ public class COSStream extends COSDictio
             //if the length is zero then don't bother trying to decode
             //some filters don't work when attempting to decode
             //with a zero length stream.  See zlib_error_01.pdf
+        	IOUtils.closeQuietly(unFilteredStream);
             unFilteredStream = new RandomAccessFileOutputStream( file );
             done = true;
         }
@@ -288,6 +296,7 @@ public class COSStream extends COSDictio
                 {
                     input = new BufferedInputStream(
                         new RandomAccessFileInputStream( file, position, length ), BUFFER_SIZE );
+                	IOUtils.closeQuietly(unFilteredStream);
                     unFilteredStream = new RandomAccessFileOutputStream( file );
                     filter.decode( input, unFilteredStream, this, filterIndex );
                     done = true;
@@ -315,6 +324,7 @@ public class COSStream extends COSDictio
                     {
                         input = new BufferedInputStream(
                             new RandomAccessFileInputStream( file, position, length ), BUFFER_SIZE );
+                    	IOUtils.closeQuietly(unFilteredStream);
                         unFilteredStream = new RandomAccessFileOutputStream( file );
                         filter.decode( input, unFilteredStream, this, filterIndex );
                         done = true;
@@ -383,6 +393,7 @@ public class COSStream extends COSDictio
         InputStream input = new BufferedInputStream(
             new RandomAccessFileInputStream( file, filteredStream.getPosition(),
                                                    filteredStream.getLength() ), BUFFER_SIZE );
+        IOUtils.closeQuietly(filteredStream);
         filteredStream = new RandomAccessFileOutputStream( file );
         filter.encode( input, filteredStream, this, filterIndex );
         IOUtils.closeQuietly(input);
@@ -413,8 +424,10 @@ public class COSStream extends COSDictio
      */
     public OutputStream createFilteredStream() throws IOException
     {
+    	IOUtils.closeQuietly(unFilteredStream);
+    	unFilteredStream = null;
+    	IOUtils.closeQuietly(filteredStream);
         filteredStream = new RandomAccessFileOutputStream( file );
-        unFilteredStream = null;
         return new BufferedOutputStream( filteredStream, BUFFER_SIZE );
     }
 
@@ -431,9 +444,11 @@ public class COSStream extends COSDictio
      */
     public OutputStream createFilteredStream( COSBase expectedLength ) throws IOException
     {
+      	IOUtils.closeQuietly(unFilteredStream);
+       	unFilteredStream = null;
+    	IOUtils.closeQuietly(filteredStream);
         filteredStream = new RandomAccessFileOutputStream( file );
         filteredStream.setExpectedLength( expectedLength );
-        unFilteredStream = null;
         return new BufferedOutputStream( filteredStream, BUFFER_SIZE );
     }
 
@@ -448,6 +463,7 @@ public class COSStream extends COSDictio
     {
         setItem(COSName.FILTER, filters);
         // kill cached filtered streams
+    	IOUtils.closeQuietly(filteredStream);
         filteredStream = null;
     }
 
@@ -460,8 +476,35 @@ public class COSStream extends COSDictio
      */
     public OutputStream createUnfilteredStream() throws IOException
     {
-        unFilteredStream = new RandomAccessFileOutputStream( file );
+        IOUtils.closeQuietly(filteredStream);
         filteredStream = null;
+    	IOUtils.closeQuietly(unFilteredStream);
+        unFilteredStream = new RandomAccessFileOutputStream( file );
         return new BufferedOutputStream( unFilteredStream, BUFFER_SIZE );
     }
+    
+    public void close()
+    {
+    	try
+    	{
+    		if (file != null)
+    		{
+    			file.close();
+    			file = null;
+    		}
+    	}
+    	catch (IOException exception)
+    	{
+    		LOG.error("Exception occured when closing the file.", exception);
+    	}
+    	if (filteredStream != null)
+    	{
+    		IOUtils.closeQuietly(filteredStream);
+    	}
+    	if (unFilteredStream != null)
+    	{
+    		IOUtils.closeQuietly(unFilteredStream);
+    	}
+    	clear();
+    }
 }