Return-Path: Delivered-To: apmail-felix-dev-archive@www.apache.org Received: (qmail 44189 invoked from network); 13 Nov 2009 21:52:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 13 Nov 2009 21:52:57 -0000 Received: (qmail 71211 invoked by uid 500); 13 Nov 2009 21:52:57 -0000 Delivered-To: apmail-felix-dev-archive@felix.apache.org Received: (qmail 71119 invoked by uid 500); 13 Nov 2009 21:52:57 -0000 Mailing-List: contact dev-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 dev@felix.apache.org Received: (qmail 71109 invoked by uid 99); 13 Nov 2009 21:52:57 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Nov 2009 21:52:57 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of mrduguo@gmail.com designates 209.85.218.224 as permitted sender) Received: from [209.85.218.224] (HELO mail-bw0-f224.google.com) (209.85.218.224) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Nov 2009 21:52:49 +0000 Received: by bwz24 with SMTP id 24so3913688bwz.30 for ; Fri, 13 Nov 2009 13:52:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type; bh=y9fdMyfZ9gmLS4m7rQ8zYnFXBeZfjXRzOryx7w02D6E=; b=BU38lUjzMxZabsVwdDB9seK5vAgR3Gxx/wCy6hRuEmGcFgl1OFGlWoRXiFWPwE6599 Qy7QtJOrv6ISN/bJ0kNzcXe8+qGrZlrmpbCg4VJKRxfYtxw3Ou4foE9sQpjpLGha3MWc fEcYWn3JJu0x0jPX6BvmVyX6HMsobGgRCRFaM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=sRMk5ox41IQ135WWLxwJtMTlmZjUC7eFa3m52VWyuqL4ad8WYJKUBE7tRIPunbdYYe D4H4rdeDzEERwacejmN6qoL38rtzOFMABuLSXEHcpmyAXwbSG5ZNTz8Hccg6KLo0ijr/ e+wDxiK8vm1eQrJV1G2mzoHyuwMtRDOTNcbBY= MIME-Version: 1.0 Sender: mrduguo@gmail.com Received: by 10.103.126.34 with SMTP id d34mr154071mun.22.1258149148750; Fri, 13 Nov 2009 13:52:28 -0800 (PST) Date: Fri, 13 Nov 2009 21:52:28 +0000 X-Google-Sender-Auth: f0b86704f9216801 Message-ID: Subject: felix class loader throw NullPointerException instead of ClassNotFoundException when try to load class with empty package name From: Guo Du To: dev@felix.apache.org Content-Type: text/plain; charset=ISO-8859-1 X-Virus-Checked: Checked by ClamAV on apache.org Hi dev, I encounter an edge case of felix class loader for empty package name. THE PROBLEM org.apache.felix.framework.ModuleImpl$ModuleClassLoader throw NullPointerException when try to load class with default package name (empty package name). Felix framework version 2.0.0 (2.0.2 have the same problem) BACKGROUND I installed groovy 1.6.5 official release to felix framework, when evaluate my script, it throw the NullPointerException because groovy try to dynamically load java.util.Calendar. During the scan, it will try to load class "java$util$Calendar". The wired format will be treated by felix class loader as a class with an empty package name. Following are the stack trace. Caused by: java.lang.NullPointerException at org.apache.felix.framework.FelixResolverState.getResolvedCandidates(FelixResolverState.java:652) at org.apache.felix.framework.Felix$FelixResolver.getResolvedCandidates(Felix.java:3993) at org.apache.felix.framework.ModuleImpl.diagnoseClassLoadError(ModuleImpl.java:2144) at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:60) at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1644) at java.lang.ClassLoader.loadClass(ClassLoader.java:300) at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:660) OPTION 1 org.apache.felix.framework.ModuleImpl line:2136 try line:2137 { line:2138 pkgReq = new Requirement(ICapability.PACKAGE_NAMESPACE, "(package=" + pkgName + ")"); line:2139 } line:2140 catch (InvalidSyntaxException ex) line:2141 { line:2142 // This should never happen. line:2143 } line:2144 PackageSource[] exporters = line:2145 resolver.getResolvedCandidates(pkgReq); We need handle the exception at line:2142 or do something different before line 2138. OPTION 2 The InvalidSyntaxException is coming from org.osgi.framework.FrameworkUtil @version $Revision: 6499 $ line:1510 if (size == 0) { line:1511 throw new InvalidSyntaxException("Missing value: " line:1512 + filterstring.substring(pos), filterstring); line:1513 } Alternatively, we may fix it in FrameworkUtil to handle it properly for empty package name. OPTION 3 It works by design of OSGi spec, I need work with groovy community to make it doesn't scan empty package. I am not sure the side affect of possible fix, so leave the discussion to felix community to decide what to do. Thanks very much to share your thoughts! -Guo