You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2017/04/07 07:18:00 UTC

wicket git commit: WICKET-6353: restrict number of reflection calls

Repository: wicket
Updated Branches:
  refs/heads/classloadingfix bdc9e66c2 -> 4b2718346


WICKET-6353: restrict number of reflection calls


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4b271834
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4b271834
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4b271834

Branch: refs/heads/classloadingfix
Commit: 4b2718346c84520f197c0514c9c29320423a8b07
Parents: bdc9e66
Author: Emond Papegaaij <pa...@apache.org>
Authored: Fri Apr 7 09:17:48 2017 +0200
Committer: Emond Papegaaij <pa...@apache.org>
Committed: Fri Apr 7 09:17:48 2017 +0200

----------------------------------------------------------------------
 .../wicket/serialize/java/JavaSerializer.java   | 83 +++++++++++---------
 1 file changed, 48 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4b271834/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java b/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java
index 1e4a8be..0767f1c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java
@@ -215,15 +215,16 @@ public class JavaSerializer implements ISerializer
 		 * resolves a class by name, first using the default Class.forName, but looking in the
 		 * Wicket ClassResolvers as well.
 		 */
-		private Class< ? > resolveClassByName(String className) throws ClassNotFoundException
+		private Class<?> resolveClassByName(String className, ClassLoader latestUserDefined)
+			throws ClassNotFoundException
 		{
 			try
 			{
-				return Class.forName(className, false, latestUserDefinedLoader());
+				return Class.forName(className, false, latestUserDefined);
 			}
 			catch (ClassNotFoundException cnfEx)
 			{
-				Class< ? > ret = resolveClassInWicket(className);
+				Class<?> ret = resolveClassInWicket(className);
 				if (ret == null)
 					throw cnfEx;
 				return ret;
@@ -233,9 +234,9 @@ public class JavaSerializer implements ISerializer
 		/*
 		 * Resolves a class from Wicket's ClassResolver
 		 */
-		private Class< ? > resolveClassInWicket(String className) throws ClassNotFoundException
+		private Class<?> resolveClassInWicket(String className) throws ClassNotFoundException
 		{
-			Class< ? > candidate;
+			Class<?> candidate;
 			try
 			{
 				Application application = Application.get();
@@ -248,7 +249,7 @@ public class JavaSerializer implements ISerializer
 			{
 				if (ex.getCause() instanceof ClassNotFoundException)
 				{
-					throw (ClassNotFoundException) ex.getCause();
+					throw (ClassNotFoundException)ex.getCause();
 				}
 				else
 				{
@@ -265,43 +266,55 @@ public class JavaSerializer implements ISerializer
 		 * resolveClassByName.
 		 */
 		@Override
-		protected Class< ? > resolveProxyClass(String[] interfaces) throws ClassNotFoundException
+		protected Class<?> resolveProxyClass(String[] interfaces)
+			throws ClassNotFoundException, IOException
 		{
-			ClassLoader latestLoader = latestUserDefinedLoader();
-			ClassLoader nonPublicLoader = null;
-			boolean hasNonPublicInterface = false;
-
-			// define proxy in class loader of non-public interface(s), if any
-			Class< ? >[] classObjs = new Class< ? >[interfaces.length];
-			for (int i = 0; i < interfaces.length; i++)
+			try
+			{
+				return super.resolveProxyClass(interfaces);
+			}
+			catch (ClassNotFoundException cnfEx)
 			{
-				Class< ? > cl = resolveClassByName(interfaces[i]);
-				if ((cl.getModifiers() & Modifier.PUBLIC) == 0)
+				// ignore this exception.
+				log.debug(
+					"Proxy Class not found by the object outputstream itself, trying the IClassResolver");
+
+				ClassLoader latestLoader = latestUserDefinedLoader();
+				ClassLoader nonPublicLoader = null;
+				boolean hasNonPublicInterface = false;
+
+				// define proxy in class loader of non-public interface(s), if any
+				Class<?>[] classObjs = new Class<?>[interfaces.length];
+				for (int i = 0; i < interfaces.length; i++)
 				{
-					if (hasNonPublicInterface)
+					Class<?> cl = resolveClassByName(interfaces[i], latestLoader);
+					if ((cl.getModifiers() & Modifier.PUBLIC) == 0)
 					{
-						if (nonPublicLoader != cl.getClassLoader())
+						if (hasNonPublicInterface)
 						{
-							throw new IllegalAccessError(
-								"conflicting non-public interface class loaders");
+							if (nonPublicLoader != cl.getClassLoader())
+							{
+								throw new IllegalAccessError(
+									"conflicting non-public interface class loaders");
+							}
+						}
+						else
+						{
+							nonPublicLoader = cl.getClassLoader();
+							hasNonPublicInterface = true;
 						}
 					}
-					else
-					{
-						nonPublicLoader = cl.getClassLoader();
-						hasNonPublicInterface = true;
-					}
+					classObjs[i] = cl;
+				}
+				try
+				{
+					return Proxy.getProxyClass(
+						hasNonPublicInterface ? nonPublicLoader : latestLoader, classObjs);
+				}
+				catch (IllegalArgumentException e)
+				{
+					throw new ClassNotFoundException(null, e);
 				}
-				classObjs[i] = cl;
-			}
-			try
-			{
-				return Proxy.getProxyClass(hasNonPublicInterface ? nonPublicLoader : latestLoader,
-					classObjs);
-			}
-			catch (IllegalArgumentException e)
-			{
-				throw new ClassNotFoundException(null, e);
 			}
 		}