On 30/01/2015 13:36, Chris Hegarty wrote:
This is phase 1, of getting java.net.URL work with modules.
Being able to effectively specify URL protocol handler factories as fully
qualified class names, through the 'java.protocol.handler.pkgs' system property
is problematic. It requires the protocol handler factory implementation class
to be public and accessible, as the current implementation tries to instantiate
it through core reflection. Since the protocol handler factory must be an
implementation of a URLStreamHandlerFactory, it lends itself to being
retrofitted with a ServiceLoader lookup. Note, the 'java.protocol.handler.pkgs'
system property mechanism predates ServiceLoader. URL protocol handlers would
most likely have used service loader if it were available at the time.
Some URL protocol handlers are fundamental to the platform itself, like 'file'
and 'jar', it is not appropriate to attempt a service loader lookup for these,
as they may lead to recursive initialization issues. However, Java Plugin,
Webstart, and possibly other containers, do override the 'jar' handler. A new
API will be provided for this purpose. Providing an API solution should not
interfere with system initialization as it will only be called after the system
comes up and user code is executing.
The 'file' protocol handler factory will no longer be overridable, and the
system property will no longer be consulted.
Webrev and spec diffs:
http://cr.openjdk.java.net/~chegar/8064924/00/
I want to agree the approach and spec first, so that the spec changes can be
submitted for approval. A comprehensive test will be added before the code
changes are finalised.
I've had a number of off-list discussions with Chris on this and I think
the proposal and the ordering is good. It preserves behavior for those
setting the system-wide URLStreamHandlerFactory with
setURLStreamHandlerFactory and only really creates a migration issue for
those setting the JDK 1.0/1.1 era pkgs property property.
One thing that I wasn't aware of is the hairy in SAAJ. That is some
thing that will need to coordinated with upstream and hopefully Miroslav
can help on that. As upstream might still have a constraint that the
code compile with JDK 7 and JDK 8 then some adjustments might be required.
In any, the focus now is agreeing the API changes before digging into
the code changes.
I've read through the javadoc and it looks good. A couple of suggestions:
- step 2: alternative wording: "The createURLStreamHandler method of
each factory is invoked, in registration order, with the protocol
string, until a factory returns non-null".
- step 3: "ServiceLoader mechanism is used" might be better than
"ServiceLoader mechanism tries".
- step 3: "ServiceConfigurationErrors", maybe this should be singular as
the first will cause the search to bail. Related to this is
createURLStreamHandler terminating with an error or runtime exception,
you may want to mention that too.
In the @apiNote in addURLStreamHandlerFactory then "containers" might
not be understood by the reader. I don't have an alternative but maybe
make it clear that this is for system-wide configuration and not
intended to be used by transient applications.
-Alan