ClassLoader.getParent to throw exception for module classloader
Paul Sandoz
paul.sandoz at oracle.com
Fri Jun 22 02:13:57 PDT 2012
On Jun 21, 2012, at 6:19 PM, David M. Lloyd wrote:
> If "null" is to no longer mean "the JDK", then why not make it into a "nothing" class loader which loads nothing?
What will be the parent CL of a "nothing" CL?
> If it is continuing to mean the system class loader for base "java." stuff, why not just continue to let it be the parent? Every module will need visibility to "java.lang" at the least, right?
>
Note that the system CL is equal to the application module CL.
What will be the parent CL of the base module CL?
Paul.
> On 06/21/2012 11:03 AM, Paul Sandoz wrote:
>> Hi,
>>
>> http://cr.openjdk.java.net/~psandoz/jigsaw/classloader-getparent/webrev/
>>
>> In a off-list discussion there was a side comment about making ClassLoader.getParent throwing an exception for a module class loader. This type of thing is easy to loose so marking this down in email.
>>
>> This patch results in the failure of:
>>
>> jdk/test/org/openjdk/jigsaw/optional-jaxp.sh
>>
>> See below for the exception in Xerces. The code below is incorrect for module mode because it assumes a hierarchical delegation model. In com.sun.org.apache.xerces.internal.utils.ObjectFactory.findClassLoader:
>>
>> ClassLoader context = SecuritySupport.getContextClassLoader();
>> ClassLoader system = SecuritySupport.getSystemClassLoader();
>>
>> ClassLoader chain = system;
>> while (true) {
>> if (context == chain) {
>> // Assert: we are on JDK 1.1 or we have no Context ClassLoader
>> // or any Context ClassLoader in chain of system classloader
>> // (including extension ClassLoader) so extend to widest
>> // ClassLoader (always look in system ClassLoader if Xerces
>> // is in boot/extension/system classpath and in current
>> // ClassLoader otherwise); normal classloaders delegate
>> // back to system ClassLoader first so this widening doesn't
>> // change the fact that context ClassLoader will be consulted
>> ClassLoader current = ObjectFactory.class.getClassLoader();
>>
>> chain = system;
>> while (true) {
>> if (current == chain) {
>> // Assert: Current ClassLoader in chain of
>> // boot/extension/system ClassLoaders
>> return system;
>> }
>> if (chain == null) {
>> break;
>> }
>> chain = SecuritySupport.getParentClassLoader(chain);
>> }
>>
>> // Assert: Current ClassLoader not in chain of
>> // boot/extension/system ClassLoaders
>> return current;
>> }
>>
>> When ClassLoader.getParent() returns null in module mode it luckily works for the case of loading a class from within the JAXP module itself.
>>
>> This area of Xerces may need to be cleaned up to use ServiceLoader.
>>
>> In this respect the exception actually signaled the potential location of the issue that would of otherwise been hidden and trickier to find. However, the approach of throwing an exception does seem brutal. If an XML parser library is barfing, what else will?
>>
>> Paul.
>>
>> Exception in thread "main" java.lang.IllegalStateException: A module class loader does not support the hierarchical delegation mode and has no parent.
>> at java.lang.ClassLoader.getParent(ClassLoader.java:1429)
>> at com.sun.org.apache.xerces.internal.utils.SecuritySupport$3.run(SecuritySupport.java:82)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at com.sun.org.apache.xerces.internal.utils.SecuritySupport.getParentClassLoader(SecuritySupport.java:78)
>> at com.sun.org.apache.xerces.internal.utils.ObjectFactory.findClassLoader(ObjectFactory.java:221)
>> at com.sun.org.apache.xerces.internal.utils.ObjectFactory.newInstance(ObjectFactory.java:255)
>> at com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory.getInstance(DTDDVFactory.java:64)
>> at com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory.getInstance(DTDDVFactory.java:49)
>> at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.<init>(XML11Configuration.java:565)
>> at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:130)
>> at com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:91)
>> at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(DOMParser.java:138)
>> at com.sun.org.apache.xerces.internal.parsers.DOMParser.<init>(DOMParser.java:122)
>> at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.<init>(DocumentBuilderImpl.java:120)
>> at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(DocumentBuilderFactoryImpl.java:76)
>> at sun.util.xml.XMLUtils.getLoadingDoc(XMLUtils.java:99)
>> at sun.util.xml.XMLUtils.load(XMLUtils.java:75)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>> at java.lang.reflect.Method.invoke(Method.java:474)
>> at java.util.Properties$XMLUtils.invoke(Properties.java:1157)
>> at java.util.Properties$XMLUtils.load(Properties.java:1178)
>> at java.util.Properties.loadFromXML(Properties.java:875)
>> at org.astro.World.name(World.java:11)
>> at com.greetings.Hello.main(Hello.java:5)
>>
>
>
> --
> - DML
More information about the jigsaw-dev
mailing list