Return-Path: X-Original-To: apmail-aries-commits-archive@www.apache.org Delivered-To: apmail-aries-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 824FD6EB5 for ; Tue, 7 Jun 2011 18:51:40 +0000 (UTC) Received: (qmail 69056 invoked by uid 500); 7 Jun 2011 18:51:40 -0000 Delivered-To: apmail-aries-commits-archive@aries.apache.org Received: (qmail 69012 invoked by uid 500); 7 Jun 2011 18:51:40 -0000 Mailing-List: contact commits-help@aries.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@aries.apache.org Delivered-To: mailing list commits@aries.apache.org Received: (qmail 68995 invoked by uid 99); 7 Jun 2011 18:51:40 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Jun 2011 18:51:40 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Jun 2011 18:51:37 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 62DB123889ED; Tue, 7 Jun 2011 18:51:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1133129 - /aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java Date: Tue, 07 Jun 2011 18:51:16 -0000 To: commits@aries.apache.org From: timothyjward@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110607185116.62DB123889ED@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: timothyjward Date: Tue Jun 7 18:51:16 2011 New Revision: 1133129 URL: http://svn.apache.org/viewvc?rev=1133129&view=rev Log: ARIES-671 : Cope with non-imported dependencies for proxy by interface Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java?rev=1133129&r1=1133128&r2=1133129&view=diff ============================================================================== --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java (original) +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/ProxyClassLoader.java Tue Jun 7 18:51:16 2011 @@ -1,18 +1,21 @@ package org.apache.aries.proxy.impl.interfaces; import java.security.ProtectionDomain; -import java.util.Collection; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import org.apache.aries.proxy.InvocationListener; import org.apache.aries.proxy.UnableToProxyException; import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter; import org.apache.aries.proxy.weaving.WovenProxy; import org.apache.aries.util.AriesFrameworkUtil; -import org.apache.aries.util.BundleToClassLoaderAdapter; import org.osgi.framework.Bundle; /** An implementation of ClassLoader that will be used to define our proxy class */ @@ -22,6 +25,13 @@ final class ProxyClassLoader extends Cla private final ConcurrentMap>, String> classes = new ConcurrentHashMap>, String>(); + private final ConcurrentMap> locatedClasses = + new ConcurrentHashMap>(); + + private final Set> ifaces = new HashSet>(); + + private final ReadWriteLock ifacesLock = new ReentrantReadWriteLock(); + public ProxyClassLoader(Bundle bundle) { super(AriesFrameworkUtil.getClassLoader(bundle)); } @@ -33,8 +43,30 @@ final class ProxyClassLoader extends Cla return WovenProxy.class; else if (InvocationListener.class.getName().equals(className)) return InvocationListener.class; - else - return null; + else { + Class c = locatedClasses.get(className); + if(c != null) + return c; + Lock rLock = ifacesLock.readLock(); + rLock.lock(); + try { + Set cls = new HashSet(); + for(Class iface : ifaces) { + if(cls.add(iface.getClassLoader())) { + try { + c = Class.forName(className, false, iface.getClassLoader()); + locatedClasses.put(className, c); + return c; + } catch (ClassNotFoundException e) { + // This is a no-op + } + } + } + } finally { + rLock.unlock(); + } + } + return null; } public Class createProxyClass(HashSet> createSet) throws UnableToProxyException { @@ -50,16 +82,24 @@ final class ProxyClassLoader extends Cla } } + Lock wLock = ifacesLock.writeLock(); + wLock.lock(); + try { + ifaces.addAll(createSet); + } finally { + wLock.unlock(); + } + className = "Proxy" + AbstractWovenProxyAdapter.getSanitizedUUIDString(); InterfaceCombiningClassAdapter icca = new InterfaceCombiningClassAdapter( className, this, createSet); - //Use the protection domain of the first interface in the set + //Do not use a protection domain the real code will inherit permissions from + //the real class, not the proxy class try { byte[] bytes = icca.generateBytes(); - ProtectionDomain pd = createSet.iterator().next().getProtectionDomain(); - Class c = defineClass(className, bytes, 0, bytes.length, pd); + Class c = defineClass(className, bytes, 0, bytes.length); String old = classes.putIfAbsent(createSet, className); if(old != null) { c = Class.forName(className, false, this);