You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/10/21 06:39:59 UTC

svn commit: r1025820 - /wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java

Author: ivaynberg
Date: Thu Oct 21 04:39:59 2010
New Revision: 1025820

URL: http://svn.apache.org/viewvc?rev=1025820&view=rev
Log:
fixed the rare but seriously annoying stack overflow in serializable checker. had to do with checking objects that override serialization.

Modified:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java?rev=1025820&r1=1025819&r2=1025820&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/SerializableChecker.java Thu Oct 21 04:39:59 2010
@@ -34,6 +34,7 @@ import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Stack;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.WicketRuntimeException;
@@ -302,6 +303,8 @@ public final class SerializableChecker e
 	/** Exception that should be set as the cause when throwing a new exception. */
 	private final NotSerializableException exception;
 
+	private final Stack<Object> stack = new Stack<Object>();
+
 	/**
 	 * Construct.
 	 * 
@@ -337,6 +340,29 @@ public final class SerializableChecker e
 			return;
 		}
 
+		if (stack.contains(obj))
+		{
+			return;
+		}
+
+		stack.push(obj);
+		try
+		{
+			internalCheck(obj);
+		}
+		finally
+		{
+			stack.pop();
+		}
+	}
+
+	private void internalCheck(Object obj)
+	{
+		if (obj == null)
+		{
+			return;
+		}
+
 		Class<?> cls = obj.getClass();
 		nameStack.add(simpleName);
 		traceStack.add(new TraceSlot(obj, fieldDescription));