RFR: javax.xml.transform: Using ServiceLoader to load JAXP stream factories (7169894: JAXP Plugability Layer: using service loader)
Joe Wang
huizhe.wang at oracle.com
Wed Dec 19 18:56:28 UTC 2012
On 12/19/2012 6:34 AM, Daniel Fuchs wrote:
> Hi,
>
> Please find below an updated webrev for the javax.xml.transform
> package, taking into account Mandy's & Joe's comments - namely:
>
> 1. Fixed call to creationMethod.invoke.
>
> 2. Got rid of the 4 args FactoryFinder.newInstance method.
>
> 3. Got rid of the useBSClsLoader which was always passed as 'false'.
> (thanks Mandy!)
I agree with the change. Just to clarify, the only case where
useBSClsLoader could be 'true' was in the old findJarServiceProvider
method.
There might be subtle things the ServiceLoader does that could be
different from the findJarServiceProvider process. In both processes,
ContextClassLoader is used first, then the old process would try the
classloader of the finder class which is the bootclassloader.
The ServiceLoader spec says: The ServiceLoader.load(service) is
equivalent to ServiceLoader.load(service,
Thread.currentThread().getContextClassLoader()) where "loader - The
class loader to be used to load provider-configuration files and
provider classes, or null if the system class loader (or, failing that,
the bootstrap class loader) is to be used "
So we need to make sure it works fine when ContextClassLoader is null,
or ContextClassLoader's parent is not the app class loader. I think we
have regression tests for the scenarios. Since you've run them, I don't
see there's any problem.
-Joe
>
> <http://cr.openjdk.java.net/~dfuchs/JDK-7169894/javax.xml.transform/webrev.01/>
>
>
>
> -- daniel
>
> On 12/18/12 11:02 PM, Daniel Fuchs wrote:
>> On 12/18/12 9:06 PM, Mandy Chung wrote:
>>> In FactoryFinder.newInstanceNoServiceLoader method, L223, 226 -
>>> NoSuchMethodException will be thrown if such method doesn't exist.
>>> creationMethod will not be null.
>> Thanks - yes - you're right of course - no need to check for null...
>>> L236 - this change is not needed, right? The method is a static
>>> no-arg method. You passed an additional argument creationMethod as the
>>> first parameter although it's harmless as it's ignored.
>> Oops - my bad. That's a mistake - I did too many successive changes -
>> should be creationMethod.invoke(null) of course.
>> And my tests didn't even catch it!
>>>
>>> A minor comment:
>>> 151 static<T> T newInstance(Class<T> type, String className,
>>> ClassLoader cl, boolean doFallback)
>>> 152 throws TransformerFactoryConfigurationError
>>> 153 {
>>> 154 return newInstance(type, className, cl, doFallback,
>>> false, false);
>>> 155 }
>>>
>>> The FactoryFinder.newInstance method 4-argument version is only
>>> called by
>>> TransformerFactory.newInstance(String factoryClassName, ClassLoader
>>> classLoader).
>>> Perhaps you can clean this up TransformerFactory to call the
>>> Factory.newInstance
>>> method 6-argument version.
>> 3 successive boolean parameters... I hate that ;-) Yes I think I can do
>> this cleanup...
>>
>> Thanks Mandy,
>>
>> -- daniel
>>
>>>
>>> Thanks
>>> Mandy
>>
>
More information about the core-libs-dev
mailing list