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 2011/01/13 21:22:45 UTC

svn commit: r1058731 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Author: lehmi
Date: Thu Jan 13 20:22:45 2011
New Revision: 1058731

URL: http://svn.apache.org/viewvc?rev=1058731&view=rev
Log:
PDFBOX274: improved the write performance as proposed by wasabii

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1058731&r1=1058730&r2=1058731&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Thu Jan 13 20:22:45 2011
@@ -23,12 +23,11 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
-import java.util.List;
+import java.util.LinkedList;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -165,26 +164,27 @@ public class COSWriter implements ICOSVi
     private long number = 0;
 
     // maps the object to the keys generated in the writer
-    // these are used for indirect refrences in other objects
+    // these are used for indirect references in other objects
     //A hashtable is used on purpose over a hashmap
     //so that null entries will not get added.
-    private Map objectKeys = new Hashtable();
+    private Map<COSBase,COSObjectKey> objectKeys = new Hashtable<COSBase,COSObjectKey>();
 
     // the list of x ref entries to be made so far
-    private List xRefEntries = new ArrayList();
+    private LinkedList xRefEntries = new LinkedList();
 
     //A list of objects to write.
-    private List objectsToWrite = new ArrayList();
+    private LinkedList<COSBase> objectsToWrite = new LinkedList<COSBase>();
+    private HashSet<COSBase> objectsToWriteSet = new HashSet<COSBase>();
 
     //a list of objects already written
-    private Set writtenObjects = new HashSet();
+    private Set<COSBase> writtenObjects = new HashSet<COSBase>();
     //An 'actual' is any COSBase that is not a COSObject.
     //need to keep a list of the actuals that are added
     //as well as the objects because there is a problem
     //when adding a COSObject and then later adding
     //the actual for that object, so we will track
     //actuals separately.
-    private Set actualsAdded = new HashSet();
+    private Set<COSBase> actualsAdded = new HashSet<COSBase>();
 
     private COSObjectKey currentObjectKey = null;
 
@@ -247,7 +247,7 @@ public class COSWriter implements ICOSVi
      *
      * @return A map of all object keys.
      */
-    public java.util.Map getObjectKeys()
+    public java.util.Map<COSBase,COSObjectKey> getObjectKeys()
     {
         return objectKeys;
     }
@@ -357,7 +357,8 @@ public class COSWriter implements ICOSVi
 
         while( objectsToWrite.size() > 0 )
         {
-            COSBase nextObject = (COSBase)objectsToWrite.remove( 0 );
+            COSBase nextObject = (COSBase)objectsToWrite.removeFirst();
+            objectsToWriteSet.remove(nextObject);
             doWriteObject( nextObject );
         }
 
@@ -371,17 +372,11 @@ public class COSWriter implements ICOSVi
 
         while( objectsToWrite.size() > 0 )
         {
-            COSBase nextObject = (COSBase)objectsToWrite.remove( 0 );
+            COSBase nextObject = (COSBase)objectsToWrite.removeFirst();
+            objectsToWriteSet.remove(nextObject);
             doWriteObject( nextObject );
         }
 
-        // write all objects
-        /**
-        for (Iterator i = doc.getObjects().iterator(); i.hasNext();)
-        {
-            COSObject obj = (COSObject) i.next();
-            doWriteObject(obj);
-        }**/
     }
 
     private void addObjectToWrite( COSBase object )
@@ -393,10 +388,11 @@ public class COSWriter implements ICOSVi
         }
 
         if( !writtenObjects.contains( object ) &&
-            !objectsToWrite.contains( object ) &&
+            !objectsToWriteSet.contains( object ) &&
             !actualsAdded.contains( actual ) )
         {
             objectsToWrite.add( object );
+            objectsToWriteSet.add( object );
             if( actual != null )
             {
                 actualsAdded.add( actual );
@@ -610,9 +606,9 @@ public class COSWriter implements ICOSVi
         {
             int count = 0;
             getStandardOutput().write(ARRAY_OPEN);
-            for (Iterator i = obj.iterator(); i.hasNext();)
+            for (Iterator<COSBase> i = obj.iterator(); i.hasNext();)
             {
-                COSBase current = (COSBase) i.next();
+                COSBase current = i.next();
                 if( current instanceof COSDictionary )
                 {
                     addObjectToWrite( current );
@@ -1041,14 +1037,14 @@ public class COSWriter implements ICOSVi
             try
             {
 
-                //algothim says to use time/path/size/values in doc to generate
+                //algorithm says to use time/path/size/values in doc to generate
                 //the id.  We don't have path or size, so do the best we can
                 MessageDigest md = MessageDigest.getInstance( "MD5" );
                 md.update( Long.toString( System.currentTimeMillis()).getBytes() );
                 COSDictionary info = (COSDictionary)trailer.getDictionaryObject( COSName.INFO );
                 if( info != null )
                 {
-                    Iterator values = info.getValues().iterator();
+                    Iterator<COSBase> values = info.getValues().iterator();
                     while( values.hasNext() )
                     {
                         md.update( values.next().toString().getBytes() );
@@ -1065,25 +1061,6 @@ public class COSWriter implements ICOSVi
                 throw new COSVisitorException( e );
             }
         }
-
-        /*
-        List objects = doc.getObjects();
-        Iterator iter = objects.iterator();
-        long maxNumber = 0;
-        while( iter.hasNext() )
-        {
-            COSObject object = (COSObject)iter.next();
-            if( object.getObjectNumber() != null &&
-                object.getGenerationNumber() != null )
-            {
-                COSObjectKey key = new COSObjectKey( object.getObjectNumber().longValue(),
-                                                     object.getGenerationNumber().longValue() );
-                objectKeys.put( object.getObject(), key );
-                objectKeys.put( object, key );
-                maxNumber = Math.max( key.getNumber(), maxNumber );
-                setNumber( maxNumber );
-            }
-        }*/
         cosDoc.accept(this);
     }
 }