Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 97152 invoked from network); 12 Mar 2009 19:51:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 Mar 2009 19:51:00 -0000 Received: (qmail 18436 invoked by uid 500); 12 Mar 2009 19:51:00 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 18407 invoked by uid 500); 12 Mar 2009 19:50:59 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 18398 invoked by uid 99); 12 Mar 2009 19:50:59 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 12 Mar 2009 12:50:59 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.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; Thu, 12 Mar 2009 19:50:57 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E593323888CA; Thu, 12 Mar 2009 19:50:35 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r752985 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java Date: Thu, 12 Mar 2009 19:50:35 -0000 To: commits@felix.apache.org From: rickhall@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090312195035.E593323888CA@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rickhall Date: Thu Mar 12 19:50:35 2009 New Revision: 752985 URL: http://svn.apache.org/viewvc?rev=752985&view=rev Log: Applied patch (FELIX-962) to further improve our class loading delegation hack. Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java?rev=752985&r1=752984&r2=752985&view=diff ============================================================================== --- felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java (original) +++ felix/trunk/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java Thu Mar 12 19:50:35 2009 @@ -18,6 +18,7 @@ */ package org.apache.felix.framework.searchpolicy; +import java.lang.reflect.InvocationTargetException; import org.apache.felix.moduleloader.*; import java.io.IOException; import java.io.InputStream; @@ -1244,25 +1245,71 @@ return null; } - private boolean isClassNotLoadedFromBundle(Class clazz) throws ClassNotFoundException + private boolean isClassNotLoadedFromBundle(Class clazz) { - int idx = clazz.getName().lastIndexOf('$'); - if (idx > 0) + // If this is an inner class, try to get the enclosing class + // because we can assume that inner classes of class loaders + // are really just the class loader and we should ignore them. + clazz = getEnclosingClass(clazz); + return (this.getClass().getClassLoader() != clazz.getClassLoader()) + && !ClassLoader.class.isAssignableFrom(clazz) + && !Class.class.equals(clazz) + && !Proxy.class.equals(clazz); + } + + private volatile static Method getEnclosingClassMethod = null; + private volatile static boolean getEnclosingClassMethodInitialized = false; + + private static Class getEnclosingClass(Class clazz) + { + if (!getEnclosingClassMethodInitialized) + { + // Check if we have the getEnclosingClass() method available from + // JDK 1.5. + try + { + getEnclosingClassMethod = + Class.class.getDeclaredMethod("getEnclosingClass", null); + } + catch (NoSuchMethodException ex) + { + // Ignore it then. + } + getEnclosingClassMethodInitialized = true; + } + if (getEnclosingClassMethod != null) + { + try + { + Class enclosing = (Class) getEnclosingClassMethod.invoke(clazz, null); + clazz = (enclosing != null) ? enclosing : clazz; + } + catch (Throwable t) + { + // Ignore everything and use original class. + } + } + else { - if (clazz.getClassLoader() != null) + // If we are not on JDK 1.5, try to figure out enclosing class. + int idx = clazz.getName().lastIndexOf('$'); + if (idx > 0) { - Class outerClass = clazz.getClassLoader().loadClass( - clazz.getName().substring(0, idx)); - if (outerClass != null) + ClassLoader cl = clazz.getClassLoader() != null ? clazz.getClassLoader() : ClassLoader.getSystemClassLoader(); + try { - clazz = outerClass; + Class enclosing = cl.loadClass(clazz.getName().substring(0, idx)); + clazz = (enclosing != null) ? enclosing : clazz; + } + catch (Throwable t) + { + // Ignore all problems since we are trying to load a class + // inside the class loader and this can lead to + // ClassCircularityError, for example. } } } - return this.getClass().getClassLoader() != clazz.getClassLoader() - && !ClassLoader.class.isAssignableFrom(clazz) - && !Class.class.equals(clazz) - && !Proxy.class.equals(clazz); + return clazz; } private boolean shouldBootDelegate(String pkgName)