You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/10/10 17:53:59 UTC
svn commit: r1764157 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java
Author: tilman
Date: Mon Oct 10 17:53:58 2016
New Revision: 1764157
URL: http://svn.apache.org/viewvc?rev=1764157&view=rev
Log:
PDFBOX-3514: avoid endless recursion in toString(), by Simon Steiner
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java?rev=1764157&r1=1764156&r2=1764157&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java Mon Oct 10 17:53:58 2016
@@ -17,6 +17,7 @@
package org.apache.pdfbox.cos;
import java.io.IOException;
+import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
@@ -27,6 +28,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.common.COSObjectable;
import org.apache.pdfbox.util.DateConverter;
import org.apache.pdfbox.util.SmallMap;
@@ -1467,9 +1469,8 @@ public class COSDictionary extends COSBa
*/
public COSBase getObjectFromPath(String objPath)
{
- COSBase retval = null;
String[] path = objPath.split(PATH_SEPARATOR);
- retval = this;
+ COSBase retval = this;
for (String pathString : path)
{
if (retval instanceof COSArray)
@@ -1501,25 +1502,54 @@ public class COSDictionary extends COSBa
@Override
public String toString()
{
- StringBuilder retVal = new StringBuilder(getClass().getSimpleName());
- retVal.append("{");
- for (COSName key : items.keySet())
- {
- retVal.append("(");
- retVal.append(key);
- retVal.append(":");
- if (getDictionaryObject(key) != null)
+ try
+ {
+ return getDictionaryString(this, new ArrayList<COSBase>());
+ }
+ catch (IOException e)
+ {
+ return "COSDictionary{" + e.getMessage() + "}";
+ }
+ }
+
+ private static String getDictionaryString(COSBase base, List<COSBase> objs) throws IOException
+ {
+ if (base == null)
+ {
+ return "null";
+ }
+ if (objs.contains(base))
+ {
+ // avoid endless recursion
+ return String.valueOf(base.hashCode());
+ }
+ objs.add(base);
+ if (base instanceof COSDictionary)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("COSDictionary{");
+ for (Map.Entry<COSName, COSBase> x : ((COSDictionary) base).entrySet())
{
- retVal.append(getDictionaryObject(key).toString());
+ sb.append(x.getKey());
+ sb.append(":");
+ sb.append(getDictionaryString(x.getValue(), objs));
+ sb.append(";");
}
- else
+ sb.append("}");
+ if (base instanceof COSStream)
{
- retVal.append("<null>");
+ InputStream stream = ((COSStream) base).createRawInputStream();
+ byte[] b = IOUtils.toByteArray(stream);
+ sb.append("COSStream{").append(Arrays.hashCode(b)).append("}");
+ stream.close();
}
- retVal.append(") ");
+ return sb.toString();
+ }
+ if (base instanceof COSObject)
+ {
+ COSObject obj = (COSObject) base;
+ return "COSObject{" + getDictionaryString(obj.getObject(), objs) + "}";
}
- retVal.append("}");
- return retVal.toString();
+ return base.toString();
}
-
}