Date: 2004-06-30T15:55:27
Editor: NareshSikha <[EMAIL PROTECTED]>
Wiki: Jakarta HiveMind Wiki
Page: UsingJNDIToObtainHiveMindServices
URL:
http://wiki.apache.org/jakarta-hivemind/UsingJNDIToObtainHiveMindServices
no comment
Change Log:
------------------------------------------------------------------------------
@@ -13,3 +13,48 @@
I think it's a very good idea, where practical, to do this extra step ... it
supports the ''Feedback'' principle. This is insurance against a change to a
3rd party library where an existing service's interface is changed (a bad
idea!). Your existing code will fail ... but fail with a more sophisticated
message. This is why I would object to a convienience method that takes just a
service name.
DanielFeist: I agree completly and don't think the addition of another method
which takes just the service-id is a good idea. I just wanted to know if the
passing of {{{Object.class}}} is acceptable if there is a situation, like in
the example I gave or similair, where it is not possible to pass the interface
expected.
+
+== Discussion ==
+
+I believe it is possible to infer the class name from the lookup request. Here
is an example of using JNDI to discover the ThreadLocalStorage service.
+
+{{{
+Context c = new InitialContext();
+ThreadLocalStorage tls = (ThreadLocalStorage) c.lookup("service:" +
ThreadLocalStorage.class.getName());
+}}}
+
+If there was a distinct service id, then that could be managed as well.
+
+{{{
+Context c = new InitialContext();
+ThreadLocalStorage tls = (ThreadLocalStorage) c.lookup("service:" +
ThreadLocalStorage.class.getName() + "!some.service.id");
+}}}
+
+The internals of the lookup method could tokenize the string and do a forName
on the class portion of the string.
+
+{{{
+public class serviceURLContext implements Context {
+ private Registry _registry;
+
+ public Object lookup(String name) throws NamingException {
+ name = name.substring(8).trim();
+
+ String serviceClassName = null;
+ String serviceId = null;
+
+ int i = name.indexOf("!");
+ if (i > 0) {
+ serviceClassName = name.substring(0, i);
+ serviceId = name.substring(i + 1);
+ } else {
+ serviceClassName = name;
+ serviceId = name;
+ }
+
+ Class serviceClass = Thread.currentThread().getContextClassLoader().
+ loadClass(serviceClassName);
+
+ return _registry.getService(serviceId, serviceClass);
+ }
+}
+}}}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]