WICKET-4663 LazyInitProxyFactory uses wrong ClassLoader in OSGi environment


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

Branch: refs/heads/master
Commit: 9dda5dce7889de626b5c44ea22390451828879a2
Parents: 325049d
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Mon Jul 23 11:03:35 2012 +0300
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Mon Jul 23 11:03:35 2012 +0300

----------------------------------------------------------------------
 .../wicket/application/AbstractClassResolver.java  |    7 -----
 .../wicket/application/CompoundClassResolver.java  |   19 +++++++++++++
 .../wicket/application/DefaultClassResolver.java   |    2 +-
 .../apache/wicket/application/IClassResolver.java  |    6 ++++
 .../apache/wicket/proxy/LazyInitProxyFactory.java  |   21 ++++++++++++--
 5 files changed, 44 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/9dda5dce/wicket-core/src/main/java/org/apache/wicket/application/AbstractClassResolver.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/application/AbstractClassResolver.java
 
b/wicket-core/src/main/java/org/apache/wicket/application/AbstractClassResolver.java
index dbd4fe2..e2a4997 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/application/AbstractClassResolver.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/application/AbstractClassResolver.java
@@ -117,13 +117,6 @@ public abstract class AbstractClassResolver implements 
IClassResolver
                return clazz;
        }
 
-       /**
-        * Returns the {@link ClassLoader} to be used for resolving classes
-        * 
-        * @return the {@link ClassLoader} to be used for resolving classes
-        */
-       protected abstract ClassLoader getClassLoader();
-
        @Override
        public Iterator<URL> getResources(final String name)
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/9dda5dce/wicket-core/src/main/java/org/apache/wicket/application/CompoundClassResolver.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/application/CompoundClassResolver.java
 
b/wicket-core/src/main/java/org/apache/wicket/application/CompoundClassResolver.java
index 8a39a9c..f73bae3 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/application/CompoundClassResolver.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/application/CompoundClassResolver.java
@@ -109,6 +109,25 @@ public class CompoundClassResolver implements 
IClassResolver
        }
 
        /**
+        * @return the class loader returned by the first registered 
IClassResolver. If there is no
+        *  registered IClassResolver then the current thread's context class 
loader will be returned.
+        */
+       @Override
+       public ClassLoader getClassLoader()
+       {
+               final ClassLoader classLoader;
+               if (resolvers.isEmpty() == false)
+               {
+                       classLoader = 
resolvers.iterator().next().getClassLoader();
+               }
+               else
+               {
+                       classLoader = 
Thread.currentThread().getContextClassLoader();
+               }
+               return classLoader;
+       }
+
+       /**
         * Adds a resolver
         * 
         * @param resolver

http://git-wip-us.apache.org/repos/asf/wicket/blob/9dda5dce/wicket-core/src/main/java/org/apache/wicket/application/DefaultClassResolver.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/application/DefaultClassResolver.java
 
b/wicket-core/src/main/java/org/apache/wicket/application/DefaultClassResolver.java
index e83e417..eb9fe7d 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/application/DefaultClassResolver.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/application/DefaultClassResolver.java
@@ -34,7 +34,7 @@ public final class DefaultClassResolver extends 
AbstractClassResolver
         *         {@link ClassLoader} that was used to load this class.
         */
        @Override
-       protected ClassLoader getClassLoader()
+       public ClassLoader getClassLoader()
        {
                ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
                if (loader == null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/9dda5dce/wicket-core/src/main/java/org/apache/wicket/application/IClassResolver.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/application/IClassResolver.java 
b/wicket-core/src/main/java/org/apache/wicket/application/IClassResolver.java
index c7e9cf9..6fcfe04 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/application/IClassResolver.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/application/IClassResolver.java
@@ -47,4 +47,10 @@ public interface IClassResolver
         */
        Iterator<URL> getResources(String name);
 
+       /**
+        * Returns the {@link ClassLoader} to be used for resolving classes
+        *
+        * @return the {@link ClassLoader} to be used for resolving classes
+        */
+       ClassLoader getClassLoader();
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/9dda5dce/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java
----------------------------------------------------------------------
diff --git 
a/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java 
b/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java
index c23ddfd..94a2875 100644
--- a/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java
+++ b/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java
@@ -30,10 +30,12 @@ import net.sf.cglib.core.Predicate;
 import net.sf.cglib.proxy.Enhancer;
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
-import org.apache.wicket.util.io.IClusterable;
+import org.apache.wicket.Application;
 import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.model.IModel;
+import org.apache.wicket.application.IClassResolver;
 import org.apache.wicket.core.util.lang.WicketObjects;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.util.io.IClusterable;
 
 /**
  * A factory class that creates lazy init proxies given a type and a {@link 
IProxyTargetLocator}
@@ -135,7 +137,20 @@ public class LazyInitProxyFactory
 
                        try
                        {
-                               return 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+                               ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
+                               if (Application.exists())
+                               {
+                                       IClassResolver classResolver = 
(IClassResolver) Application.get()
+                                                       
.getApplicationSettings()
+                                                       .getClassResolver();
+
+                                       if (classResolver != null)
+                                       {
+                                               classLoader = 
classResolver.getClassLoader();
+                                       }
+                               }
+
+                               return Proxy.newProxyInstance(classLoader,
                                        new Class[] { type, Serializable.class, 
ILazyInitProxy.class,
                                                        IWriteReplace.class }, 
handler);
                        }

Reply via email to