You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2013/08/23 14:13:19 UTC
svn commit: r1516827 - in /cxf/branches/2.7.x-fixes: ./
api/src/main/java/org/apache/cxf/common/util/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
Author: cschneider
Date: Fri Aug 23 12:13:18 2013
New Revision: 1516827
URL: http://svn.apache.org/r1516827
Log:
CXF-5228 backport
Added:
cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyClassLoader.java
- copied, changed from r1516768, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ProxyClassLoader.java
Removed:
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ProxyClassLoader.java
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyHelper.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Reverse-merged /cxf/trunk:r1516724-1516735,1516754-1516760
Merged /cxf/trunk:r1516747
Copied: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyClassLoader.java (from r1516768, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ProxyClassLoader.java)
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyClassLoader.java?p2=cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyClassLoader.java&p1=cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ProxyClassLoader.java&r1=1516768&r2=1516827&rev=1516827&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ProxyClassLoader.java (original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyClassLoader.java Fri Aug 23 12:13:18 2013
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.cxf.jaxrs.client;
+package org.apache.cxf.common.util;
import java.net.URL;
import java.util.HashSet;
Modified: cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyHelper.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyHelper.java?rev=1516827&r1=1516826&r2=1516827&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyHelper.java (original)
+++ cxf/branches/2.7.x-fixes/api/src/main/java/org/apache/cxf/common/util/ProxyHelper.java Fri Aug 23 12:13:18 2013
@@ -42,10 +42,44 @@ public class ProxyHelper {
}
protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
- return Proxy.newProxyInstance(loader, interfaces, handler);
+ ClassLoader combinedLoader = getClassLoaderForInterfaces(loader, interfaces);
+ return Proxy.newProxyInstance(combinedLoader, interfaces, handler);
}
-
-
+
+ /**
+ * Return a classloader that can see all the given interfaces If the given loader can see all interfaces
+ * then it is used. If not then a combined classloader of all interface classloaders is returned.
+ *
+ * @param loader use supplied class loader
+ * @param interfaces
+ * @return classloader that sees all interfaces
+ */
+ private ClassLoader getClassLoaderForInterfaces(ClassLoader loader, Class<?>[] interfaces) {
+ if (canSeeAllInterfaces(loader, interfaces)) {
+ return loader;
+ }
+ ProxyClassLoader combined = new ProxyClassLoader();
+ for (Class<?> currentInterface : interfaces) {
+ combined.addLoader(currentInterface.getClassLoader());
+ }
+ return combined;
+ }
+
+ private boolean canSeeAllInterfaces(ClassLoader loader, Class<?>[] interfaces) {
+ for (Class<?> currentInterface : interfaces) {
+ String ifName = currentInterface.getName();
+ try {
+ Class<?> ifClass = Class.forName(ifName, false, loader);
+ if (ifClass != currentInterface) {
+ return false;
+ }
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static Object getProxy(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
return HELPER.getProxyInternal(loader, interfaces, handler);
}
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java?rev=1516827&r1=1516826&r2=1516827&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java Fri Aug 23 12:13:18 2013
@@ -307,22 +307,9 @@ public class JAXRSClientFactoryBean exte
}
initClient(proxyImpl, ep, actualState == null);
- Client actualClient = null;
- try {
- ClassLoader theLoader = proxyLoader == null ? cri.getServiceClass().getClassLoader()
- : proxyLoader;
- actualClient = (Client)ProxyHelper.getProxy(theLoader,
- new Class[]{cri.getServiceClass(),
- Client.class,
- InvocationHandlerAware.class},
- proxyImpl);
- } catch (Exception ex) {
- actualClient = (Client)ProxyHelper.getProxy(Thread.currentThread().getContextClassLoader(),
- new Class[]{cri.getServiceClass(),
- Client.class,
- InvocationHandlerAware.class},
- proxyImpl);
- }
+ ClassLoader theLoader = proxyLoader == null ? cri.getServiceClass().getClassLoader() : proxyLoader;
+ Class<?>[] ifaces = new Class[]{cri.getServiceClass(), Client.class, InvocationHandlerAware.class};
+ Client actualClient = (Client)ProxyHelper.getProxy(theLoader, ifaces, proxyImpl);
notifyLifecycleManager(actualClient);
this.getServiceFactory().sendEvent(FactoryBeanListener.Event.CLIENT_CREATED, actualClient, ep);