Hey guys.
There seems to be inconsistency in GenericURLContext wrt how it handles lookup. This
breaks lookups done from AS7/Wfly. Said lookup methods [1] & [2].
The wrongdoer is code in GenericURLContext(so this probably has impact on all URL
contexts).
In case of argument like "rmi://127.0.0.1:1190/jmxrmi" there are two different
results.
If [2] is invoked with above argument it works as expected. It goes down into
getURLContext which parse URL part: "rmi://127.0.0.1:1190"
create proper stub( according to URL part ) and gives back ResolveResult.
After above, it nicely asks ResolveResult for context and "remainingName" [4] -
in this case, its last bit of original URL: "jmxrmi". This call does not fail.
However if the [1] is used, it goes wrong. Lookup method calls
"getContinuationContext" which strips part of URL and call lookup(String) with
only "rmi:" [5].
This creates URL stub with default values( in case of RMI for instance ) since
implementation assume that if there is no host:port pair, it sets
those values to localhost:1090(which may be different in URL).
This leads to [6] ( since context lookup on remainingName does not give result ). The
suffix, which is argument of this call has three parts
["","127.0.0.1:1199","jmxrmi"].
Trick is that object on which [6] is invoked takes only first part of this name, which is
empty string. Code which does that [7]. This results in exception which indicates
that URL is not accessible, while the lookup(String) will return valid object.
Initial stack trace for [1]:
rmiURLContext.getRootURLContext(String, Hashtable) line: 63
rmiURLContext(GenericURLContext).lookup(String) line: 200
rmiURLContext(GenericURLContext).getContinuationContext(Name) line: 192
rmiURLContext(GenericURLContext).lookup(Name) line: 213
InitialContext.lookup(Name, boolean) line: 112
Current wildfly code calls the lookup(Name) method[8], which will fail as described above.
This PR [9] has testcase which reproduce problem.
Im not quite sure if we can wait for JDK fix( if ever ) since this piece of code is
present in JDK7 and 6. Either this piece of code in WFLY remains as is, failing for non
localhost:1090 or
there will be nasty Name.toString() in WFLY InitialContext impl( as in [9]).
Any thoughts on this?
[1]
http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html...
[2]
http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html...
[3]
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-...
[4]
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-...
[5]
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-...
[6]
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-...
[7]
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-...
[8]
https://github.com/wildfly/wildfly/blob/master/naming/src/main/java/org/j...
[9]
https://github.com/wildfly/wildfly/pull/4477