RFR: javax.xml.stream: Using ServiceLoader to load JAXP stream factories (7169894: JAXP Plugability Layer: using service loader)

Joe Wang huizhe.wang at oracle.com
Tue Dec 18 23:10:59 UTC 2012



On 12/18/2012 2:23 PM, Daniel Fuchs wrote:
> On 12/18/12 8:00 PM, Joe Wang wrote:
>>
>>
>> On 12/18/2012 10:00 AM, Daniel Fuchs wrote:
>>> On 12/18/12 6:29 PM, Joe Wang wrote:
>>>> Hi Daniel,
>>>>
>>>> The call: T provider = findServiceProvider(type) in static <T> T
>>>> find(Class<T> type, String factoryId, ClassLoader cl, String
>>>> fallbackClassName) ignored factoryId, and assumed it's the same as
>>>> type.getName(). I looked back I had the same bug in my original patch.
>>>
>>> I don't think that's a bug in the new code - but rather possibly a
>>> bug in the old code ;-).
>>
>> The old code did not have the problem since it's reading 
>> "META-INF/services/" + factoryId directly.
>>
>>> There's no way you can pass a property name to the ServiceLoader.
>>
>> True. That's why it looked a bit awkward since 'factoryId' is not 
>> passed in as did before, as in findJarServiceProvider(factoryId).
>>
>>>
>>> The JAR Specification says:
>>>
>>> "A service provider identifies itself by placing a 
>>> provider-configuration file in the resource directory 
>>> META-INF/services. The file's name should consist of the 
>>> fully-qualified name of the abstract service class."
>>>
>>> So I think the current code is correct in ignoring factoryId - because
>>> according to the spec the file name should be the same as the
>>> abstract class name.
>>
>> So the StAX API implied that factoryId could be anything, but that 
>> would violate the JAR specification. In other words, it would only 
>> work as intended if the factoryId is specified as a System Property, 
>> or in stax.properties or jaxp.properties.
>>
>> I would think we should return an error if factoryId != 
>> type.getName() before the call "findServiceProvider(type)".
>
> In fact I toyed with the idea of skipping the call to 
> findServiceProvider(type) when factoryId != type.getName().
> I am not sure whether we should return an error or the skip directly 
> to returning the default implementation.
>
> I mean - if a user tried to load the factory specified by foo.bar, and 
> foo.bar is not defined, shouldn't we return
> the default implementation? I think that's what was happening before...

It's different. If 'foo.bar' is specified but not found, it indicates a 
configuration error. If the factory falls back to an impl by the default 
factory id, it would serve to hide the error. Note that 
newInstance/newFactory with a factoryId parameter do not fall back to 
the default implementation.

-Joe

>
> But if we return the default implementation - shouldn't any Service 
> Provider loadable through ServiceLoader take
> precedence?
>
> When the parameter is a classname - then the meaning is clear. Either 
> you can load the class or you can't.
> When it's a factoryId - and the doc says "it is the  same as a System 
> property" - then shouldn't the code
> behave as if it were a System property?
>
> -- daniel
>
>>
>> -Joe
>>
>>>
>>>
>>> -- daniel
>>>
>>>>
>>>> -Joe
>>>>
>>>> On 12/18/2012 8:39 AM, Daniel Fuchs wrote:
>>>>> Hi,
>>>>>
>>>>> Thanks for the review.
>>>>> I updated the webrev to keep track of your suggested change.
>>>>> <http://cr.openjdk.java.net/~dfuchs/JDK-7169894/javax.xml.stream/webrev.01/> 
>>>>>
>>>>>
>>>>>
>>>>> -- daniel
>>>>>
>>>>> On 12/18/12 4:00 PM, Alan Bateman wrote:
>>>>>>
>>>>>> I looked through this installment and aside from an aside from an
>>>>>> alignment issue at lines 101-102 in XMLEventFactory.java then it 
>>>>>> looks
>>>>>> good to me.
>>>>>>
>>>>>> Also thank you again for being so careful as you work through 
>>>>>> each of
>>>>>> these areas.
>>>>>>
>>>>>> -Alan
>>>>>
>>>
>



More information about the core-libs-dev mailing list