Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[e4-dev] API / Implementation feedback on contexts

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.

Back to the top