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);
}
}