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); }
