On Aug 30, 2012, at 11:20 PM, Alan Bateman <[email protected]> wrote:
> On 30/08/2012 19:38, Joe Wang wrote:
>> Hi Paul, Alan,
>>
>> I've read your latest comments. Before getting back to you on those items,
>> I felt it's important we get the classloader handling correctly. If it's as
>> what I suspected (as I described in the last email), we may have problem
>> with using ServiceLoader.
>>
>> I've read Paul's explanation, esp. the delegation to
>> ClassLoader.getSystemResourceAsStream part. It looks right as it's stated
>> in the spec. But I do remember it was the issue for CR6723276 and I did
>> change it to Object.class.getResourceAsStream (without a way to call
>> bootstrap classloader).
>>
>> Just as Paul said, the classloader stuff is quite tricky. I had three dummy
>> jars that I've been running tests with. I haven't had problems loading
>> those jars. But the tests were under 'normal' conditions, that is, the
>> usual jdk classloader hierarchy was followed.
>>
>> Also, dummy jars may work. But I should at least test Xerces. So that's what
>> I'm going to do as well.
>>
>> --Joe
> I don't think I'm following the concern here as I thought the SecuritySupport
> will either give you the TCCL or the system class loader (but never null). As
> I quick check I created a no-op SchemaFactory, packaged it up with
> META-INF/services/javax.xml.validation.SchemaFactory into a JAR and verified
> that it was located when I deploy it on either the class path or extensions
> directory. In this case, the thread invoking SchemaFactory.newInstance had
> its TCCL set to the system class loader (the default). Same thing if I change
> the TCCL to null because SecuritySupport gives the Finder the system class
> loader for that case.
>
It seems the SecuritySupport variants have slightly different functionality.
javax.xml.stream.SecuritySupport:
ClassLoader getContextClassLoader() throws SecurityException{
return (ClassLoader)
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
ClassLoader cl = null;
//try {
cl = Thread.currentThread().getContextClassLoader();
//} catch (SecurityException ex) { }
if (cl == null)
cl = ClassLoader.getSystemClassLoader();
return cl;
}
});
}
javax.xml.datatype.SecuritySupport:
ClassLoader getContextClassLoader() {
return (ClassLoader)
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
ClassLoader cl = null;
try {
cl = Thread.currentThread().getContextClassLoader();
} catch (SecurityException ex) { }
return cl;
}
});
}
I made an incorrect assumption that javax.xml.datatype.SecuritySupport was the
same as all the others.
> Paul - slap me in the face if I have this wrong, I don't want to cause any
> confusion on this, I really just want to see a current vs. proposed behavior
> for each of the finders.
>
I am getting bogged down in the weeds on this. This area is more inconsistent
than i previously thought. I think we need tests and enumerate exactly the
loading policy for each factory finder.
Paul.