I've been doing some investigatory work into how to bridge an existing services system (with thousands of services) into our IEclipseContext setup. We're dealing with potentially hundreds of such services. Here's a few things I've discovered:
- The ILookupStrategy that was backed out as a result of bug 317706 would have been really useful. In my case, I want to hook these services into the part/window/app level contexts. I can't create my own IEC subclass as I don't have the opportunity to replace the class used to create child contexts. I mentioned this on the E4 call last week and have opened bug 401931 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=401931).
- IContextFunction#compute() should receive the requested context key. We explored using IContextFunctions to look up our services, but it required creating an ICF for each service which is a bit expensive. I've filed this as bug 401933 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=401933).
For now I've instead implemented my own object supplier, which is pretty cool. Two notes from here (and they're just documentation issues):
- It's not clear how ExtendedObjectSuppliers can hook into the group-changes: although an EOS could assume that the primary object supplier is a ContextObjectSupplier and request to be injected with an IEclipseContext, the EclipseContext addWaiting()/processWaiting() is internal to contexts. This only becomes an issue if we have methods that mix custom injections and normal context injections. And perhaps this is asking a lot anyways!
- I was a bit surprised that disposing of a context doesn't uninject the fields, and so my EOS's get() wasn't called with track=false. Rather, the IRequestor.isValid() will return false once the injected object is GC'd. I saw injections continuing on my disposed objects as my objects were being held onto… by my EOS! (Inadvertent, and now fixed.)
BTW: The one gotcha to implementing a custom object supplier (any component for Declarative Services): ensure your bundle is lazily-activated as DS otherwise ignores the service components until that bundle is explicitly started.
Brian.
|