[
https://issues.apache.org/jira/browse/FELIX-3201?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Marcel Offermans resolved FELIX-3201.
-------------------------------------
Resolution: Fixed
Reviewed and committed both patches.
> Offer more functional callback methods for services that have aspects on them.
> ------------------------------------------------------------------------------
>
> Key: FELIX-3201
> URL: https://issues.apache.org/jira/browse/FELIX-3201
> Project: Felix
> Issue Type: Improvement
> Components: Dependency Manager
> Environment: n/a
> Reporter: Xander Uiterlinden
> Assignee: Marcel Offermans
> Labels: features
> Attachments: dm-core-patch.txt, dm-test-patch.txt
>
>
> When programmatically adding service dependencies using the Apache felix
> dependency manager there are two ways to have the component brought its
> dependencies when they come available. These are the following:
> - have the service injected in the component; this is usually sufficient for
> cases where there's only one service expected to satisfy the dependency
> (1-to-1) .
> - explicitly specify callback methods; callbacks can be used when there might
> be more than one service satisfying the dependency (1-to-n). When a
> dependency is marked optional, the callback method also helps to determine
> when the dependency actually became satisfied.
> When using callback methods with the dependency manager you can specify the
> following callbacks:
> - added; gets called when the service required has become available.
> - changed; gets called when the service properties of a added required
> service have changed.
> - removed; gets called when the service required has become unavailable.
> At first these callbacks seem pretty simple. Just add the service to the
> component's internal administration on the added callback and remove it from
> the administration whenever the removed callback is called. But, the
> dependency manager also supports the concept of aspect services which make
> using the callback method in a correct way a bit more difficult.
> Aspect services are services that are put on top of another service while
> still implementing the original service's interface. They allow you to
> implement cross-cutting functional requirements.
> In the OSGi service registry aspect services are individual services just
> like 'regular' singleton services. When using callback methods for
> dependencies a component is informed of the add/remove of an aspect service,
> just like it is when a 'regular' service is added/removed. When using
> injection for dependencies the aspect is transparently injected. The
> callbacks also handling aspect services the same way as 'regular' services
> makes it difficult for a component developer to correctly implement these
> callbacks.
> For example take the following scenario:
> Component A expresses a service dependency to Service B.
> Without any aspects in the container the following callbacks would be added
> on Component A.
> added(Service B)
> But whenever there's an aspect running on top of Service B, the order of
> callbacks would be as follows:
> added(Service B)
> added(Service B aspect)
> removed(Service B)
> When backed by a typical HashMap administration this would result in:
> put(B.id, B)
> put(B.id, B)
> remove(B.id)
> This sequence would result in an empty Map, which is not a desirable
> situation. In order to ease the dependency handling an additional callback
> method is needed which hides the complexity as described above and translates
> the callbacks to the following more functional callbacks:
> added; called when the service required has become available.
> swapped; called when the service required needs to be replaced due to add or
> removal of an aspect. This to be sure the component uses the aspect that's on
> top of the aspect chain for the required service.
> changed; called when the service properties of an added required service have
> changed.
> removed; called when the service required has become unavailable.
> With these callbacks a developer does not have to worry about the possible
> sequences in which added/removed can occur.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira