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 2022/06/30 15:50:36 UTC

svn commit: r1902374 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java

Author: lehmi
Date: Thu Jun 30 15:50:36 2022
New Revision: 1902374

URL: http://svn.apache.org/viewvc?rev=1902374&view=rev
Log:
PDFBOX-4892: split clone method

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java?rev=1902374&r1=1902373&r2=1902374&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java Thu Jun 30 15:50:36 2022
@@ -98,78 +98,95 @@ class PDFCloneUtility
         {
             retval = cloneForNewDocument(((COSObjectable) base).getCOSObject());
         }
-        else if (base instanceof COSObject)
+        else
+        {
+            retval = cloneCOSBaseForNewDocument((COSBase)base);
+        }
+        clonedVersion.put(base, retval);
+        clonedValues.add(retval);
+        return retval;
+    }
+
+    COSBase cloneCOSBaseForNewDocument(COSBase base) throws IOException
+    {
+        if (base instanceof COSObject)
+        {
+            return cloneForNewDocument(((COSObject) base).getObject());
+        }
+        if (base instanceof COSArray)
         {
-            COSObject object = (COSObject) base;
-            retval = cloneForNewDocument(object.getObject());
+            return cloneCOSArray((COSArray) base);
         }
-        else if (base instanceof COSArray)
+        if (base instanceof COSStream)
         {
-            COSArray newArray = new COSArray();
-            COSArray array = (COSArray) base;
-            for (int i = 0; i < array.size(); i++)
-            {
-                COSBase value = array.get(i);
-                if (hasSelfReference(array, value))
-                {
-                    newArray.add(newArray);
-                }
-                else
-                {
-                    newArray.add(cloneForNewDocument(value));
-                }
-            }
-            retval = newArray;
-        }
-        else if (base instanceof COSStream)
-        {
-            COSStream originalStream = (COSStream) base;
-            COSStream stream = destination.getDocument().createCOSStream();
-            try (OutputStream output = stream.createRawOutputStream();
-                    InputStream input = originalStream.createRawInputStream())
-            {
-                IOUtils.copy(input, output);
-            }
-            clonedVersion.put(base, stream);
-            for (Map.Entry<COSName, COSBase> entry : originalStream.entrySet())
-            {
-                COSBase value = entry.getValue();
-                if (hasSelfReference(originalStream, value))
-                {
-                    stream.setItem(entry.getKey(), stream);
-                }
-                else
-                {
-                    stream.setItem(entry.getKey(), cloneForNewDocument(value));
-                }
-            }
-            retval = stream;
-        }
-        else if (base instanceof COSDictionary)
-        {
-            COSDictionary dic = (COSDictionary) base;
-            retval = new COSDictionary();
-            clonedVersion.put(base, retval);
-            for (Map.Entry<COSName, COSBase> entry : dic.entrySet())
-            {
-                COSBase value = entry.getValue();
-                if (hasSelfReference(dic, value))
-                {
-                    ((COSDictionary) retval).setItem(entry.getKey(), retval);
-                }
-                else
-                {
-                    ((COSDictionary) retval).setItem(entry.getKey(), cloneForNewDocument(value));
-                }
+            return cloneCOSStream((COSStream) base);
+        }
+        if (base instanceof COSDictionary)
+        {
+            return cloneCOSDictionary((COSDictionary) base);
+        }
+        return base;
+    }
+
+    private COSArray cloneCOSArray(COSArray array) throws IOException
+    {
+        COSArray newArray = new COSArray();
+        for (int i = 0; i < array.size(); i++)
+        {
+            COSBase value = array.get(i);
+            if (hasSelfReference(array, value))
+            {
+                newArray.add(newArray);
+            }
+            else
+            {
+                newArray.add(cloneForNewDocument(value));
             }
         }
-        else
+        return newArray;
+    }
+
+    private COSStream cloneCOSStream(COSStream stream) throws IOException
+    {
+        COSStream newStream = destination.getDocument().createCOSStream();
+        try (OutputStream output = newStream.createRawOutputStream();
+                InputStream input = stream.createRawInputStream())
         {
-            retval = (COSBase) base;
+            IOUtils.copy(input, output);
         }
-        clonedVersion.put(base, retval);
-        clonedValues.add(retval);
-        return retval;
+        clonedVersion.put(stream, newStream);
+        for (Map.Entry<COSName, COSBase> entry : stream.entrySet())
+        {
+            COSBase value = entry.getValue();
+            if (hasSelfReference(stream, value))
+            {
+                newStream.setItem(entry.getKey(), newStream);
+            }
+            else
+            {
+                newStream.setItem(entry.getKey(), cloneForNewDocument(value));
+            }
+        }
+        return newStream;
+    }
+
+    private COSDictionary cloneCOSDictionary(COSDictionary dictionary) throws IOException
+    {
+        COSDictionary newDictionary = new COSDictionary();
+        clonedVersion.put(dictionary, newDictionary);
+        for (Map.Entry<COSName, COSBase> entry : dictionary.entrySet())
+        {
+            COSBase value = entry.getValue();
+            if (hasSelfReference(dictionary, value))
+            {
+                newDictionary.setItem(entry.getKey(), newDictionary);
+            }
+            else
+            {
+                newDictionary.setItem(entry.getKey(), cloneForNewDocument(value));
+            }
+        }
+        return newDictionary;
     }
 
     /**