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 <[email protected]>
Authored: Fri Apr 7 09:17:48 2017 +0200
Committer: Emond Papegaaij <[email protected]>
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);
                        }
                }
 

Reply via email to