You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by "Pepijn Noltes (JIRA)" <ji...@apache.org> on 2018/04/10 18:46:00 UTC

[jira] [Updated] (CELIX-441) Add service tracker api to bundle context

     [ https://issues.apache.org/jira/browse/CELIX-441?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Pepijn Noltes updated CELIX-441:
--------------------------------
    Description: 
To make the use of service trackers easier integrate a service tracker API directly on the bundle context.

The service tracker should be stored in the bundle context and automatically be closed and destroy when the bundle is respectively stopped / destroyed. 

Proposed API:

/**
 * track service for the provided serviceName and/or filter.
 * The highest ranking services will used for the callback.
 * If a new and higher ranking services the callback with be called again with the new service.
 * If a service is removed a the callback with be called with next highest ranking service or NULL as service.
 *
 * @param ctx The bundle context.
 * @param serviceName Optional the service name to track
 * @param serviceVersionRange Optional the service version range to track
 * @param filter Optional the LDAP filter to use
 * @param data The data pointer, which will be used in the callbacks
 * @param setting The callback, which will be called when a new highest ranking service is set.
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uuid_t bundleContext_trackService(
        bundle_context_t* mod,
        const char* serviceName,
        const char* serviceVersionRange,
        const char* filter,
        void* data,
        int (*setting)(void* data, void* svc)
);

/**
 * track services for the provided serviceName and/or filter.
 *
 * @param ctx The bundle context.
 * @param serviceName Optional the service name to track
 * @param serviceVersionRange Optional the service version range to track
 * @param filter Optional the LDAP filter to use
 * @param data The data pointer, which will be used in the callbacks
 * @param adding The callback, which will be called when service is added.
 * @param removing The callback, which will be called when a service is removed
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uuid_t bundleContext_trackServices(
        bundle_context_t* ctx,
        const char* serviceName,
        const char* serviceVersionRange,
        const char* filter,
        void* data,
        int (*adding)(void* data, void* svc),
        int (*removing)(void* data, void* svc)
);

typedef struct celix_service_tracker_options {
    //service filter options
    const char* serviceName;
    const char* serviceVersionRange;
    const char* filter;
    const char* lang; //NULL -> 'CELIX_LANG_C'

    //callback options
    void* callbackHandle;

    int (*onSettingFp)(void *handle, void *svc); //highest ranking
    int (*onAddingFp)(void *handle, void *svc);
    int (*onRemovingFp)(void *handle, void *svc);

    int (*onSettingWithProperties)(void *handle, properties_t *props, void *svc); //highest ranking
    int (*onAddingWithProperties)(void *handle, properties_t *props, void *svc);
    int (*onRemovingWithProperties)(void *handle, properties_t *props, void *svc);

    int (*onSettingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc); //highest ranking
    int (*onAddingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
    int (*onRemovingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
} celix_service_tracker_options;

/**
 * Tracks services using the provided tracker options.
 * The tracker options are only using during this call and can safely be freed/reused after this call returns.
 *
 * @param ctx The module context.
 * @param opts The pointer to the tracker options.
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uint64_t bundleContext_trackServicesWithOptions(bundle_context_t *ctx, const celix_service_tracker_options *opts);

//shortcut could be const celix_service_tracker_options opts = {0};

/**
 * Stop the tracker with the provided track id.
 * Only works for the trackers owned by the bundle of the bundle context.
 *
 * @return CELIX_SUCCESS if the tracker is stopped correctly.
 */
int bundleContext_stopTracking(bundle_context_t *ctx, uuid_t trackerId); [^bundle_context_additions.h] 

  was:
To make the use of service trackers easier integrate a service tracker API directly on the bundle context.

The service tracker should be stored in the bundle context and automatically be closed and destroy when the bundle is respectively stopped / destroyed. 

Proposed API:

/**
 * track service for the provided serviceName and/or filter.
 * The highest ranking services will used for the callback.
 * If a new and higher ranking services the callback with be called again with the new service.
 * If a service is removed a the callback with be called with next highest ranking service or NULL as service.
 *
 * @param ctx The bundle context.
 * @param serviceName Optional the service name to track
 * @param serviceVersionRange Optional the service version range to track
 * @param filter Optional the LDAP filter to use
 * @param data The data pointer, which will be used in the callbacks
 * @param setting The callback, which will be called when a new highest ranking service is set.
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uuid_t bundleContext_trackService(
        bundle_context_t* mod,
        const char* serviceName,
        const char* serviceVersionRange,
        const char* filter,
        void* data,
        int (*setting)(void* data, void* svc)
);

/**
 * track services for the provided serviceName and/or filter.
 *
 * @param ctx The bundle context.
 * @param serviceName Optional the service name to track
 * @param serviceVersionRange Optional the service version range to track
 * @param filter Optional the LDAP filter to use
 * @param data The data pointer, which will be used in the callbacks
 * @param adding The callback, which will be called when service is added.
 * @param removing The callback, which will be called when a service is removed
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uuid_t bundleContext_trackServices(
        bundle_context_t* ctx,
        const char* serviceName,
        const char* serviceVersionRange,
        const char* filter,
        void* data,
        int (*adding)(void* data, void* svc),
        int (*removing)(void* data, void* svc)
);

typedef struct celix_service_tracker_options {
    //service filter options
    const char* serviceName;
    const char* serviceVersionRange;
    const char* filter;
    const char* lang; //NULL -> 'CELIX_LANG_C'

    //callback options
    void* callbackHandle;

    int (*onSettingFp)(void *handle, void *svc); //highest ranking
    int (*onAddingFp)(void *handle, void *svc);
    int (*onRemovingFp)(void *handle, void *svc);

    int (*onSettingWithProperties)(void *handle, properties_t *props, void *svc); //highest ranking
    int (*onAddingWithProperties)(void *handle, properties_t *props, void *svc);
    int (*onRemovingWithProperties)(void *handle, properties_t *props, void *svc);

    int (*onSettingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc); //highest ranking
    int (*onAddingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
    int (*onRemovingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
} celix_service_tracker_options;

/**
 * Tracks services using the provided tracker options.
 * The tracker options are only using during this call and can safely be freed/reused after this call returns.
 *
 * @param ctx The module context.
 * @param opts The pointer to the tracker options.
 * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
 */
uint64_t bundleContext_trackServicesWithOptions(bundle_context_t *ctx, const celix_service_tracker_options *opts);

//shortcut could be const celix_service_tracker_options opts = {0};

/**
 * Stop the tracker with the provided track id.
 * Only works for the trackers owned by the bundle of the bundle context.
 *
 * @return CELIX_SUCCESS if the tracker is stopped correctly.
 */
int bundleContext_stopTracking(bundle_context_t *ctx, uuid_t trackerId);


> Add service tracker api to bundle context
> -----------------------------------------
>
>                 Key: CELIX-441
>                 URL: https://issues.apache.org/jira/browse/CELIX-441
>             Project: Celix
>          Issue Type: Improvement
>          Components: Framework
>    Affects Versions: 2.3.0
>            Reporter: Pepijn Noltes
>            Priority: Major
>         Attachments: bundle_context_additions.h
>
>
> To make the use of service trackers easier integrate a service tracker API directly on the bundle context.
> The service tracker should be stored in the bundle context and automatically be closed and destroy when the bundle is respectively stopped / destroyed. 
> Proposed API:
> /**
>  * track service for the provided serviceName and/or filter.
>  * The highest ranking services will used for the callback.
>  * If a new and higher ranking services the callback with be called again with the new service.
>  * If a service is removed a the callback with be called with next highest ranking service or NULL as service.
>  *
>  * @param ctx The bundle context.
>  * @param serviceName Optional the service name to track
>  * @param serviceVersionRange Optional the service version range to track
>  * @param filter Optional the LDAP filter to use
>  * @param data The data pointer, which will be used in the callbacks
>  * @param setting The callback, which will be called when a new highest ranking service is set.
>  * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
>  */
> uuid_t bundleContext_trackService(
>         bundle_context_t* mod,
>         const char* serviceName,
>         const char* serviceVersionRange,
>         const char* filter,
>         void* data,
>         int (*setting)(void* data, void* svc)
> );
> /**
>  * track services for the provided serviceName and/or filter.
>  *
>  * @param ctx The bundle context.
>  * @param serviceName Optional the service name to track
>  * @param serviceVersionRange Optional the service version range to track
>  * @param filter Optional the LDAP filter to use
>  * @param data The data pointer, which will be used in the callbacks
>  * @param adding The callback, which will be called when service is added.
>  * @param removing The callback, which will be called when a service is removed
>  * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
>  */
> uuid_t bundleContext_trackServices(
>         bundle_context_t* ctx,
>         const char* serviceName,
>         const char* serviceVersionRange,
>         const char* filter,
>         void* data,
>         int (*adding)(void* data, void* svc),
>         int (*removing)(void* data, void* svc)
> );
> typedef struct celix_service_tracker_options {
>     //service filter options
>     const char* serviceName;
>     const char* serviceVersionRange;
>     const char* filter;
>     const char* lang; //NULL -> 'CELIX_LANG_C'
>     //callback options
>     void* callbackHandle;
>     int (*onSettingFp)(void *handle, void *svc); //highest ranking
>     int (*onAddingFp)(void *handle, void *svc);
>     int (*onRemovingFp)(void *handle, void *svc);
>     int (*onSettingWithProperties)(void *handle, properties_t *props, void *svc); //highest ranking
>     int (*onAddingWithProperties)(void *handle, properties_t *props, void *svc);
>     int (*onRemovingWithProperties)(void *handle, properties_t *props, void *svc);
>     int (*onSettingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc); //highest ranking
>     int (*onAddingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
>     int (*onRemovingWithOwner)(void *handle, bundle_t *owner, properties_t *props, void *svc);
> } celix_service_tracker_options;
> /**
>  * Tracks services using the provided tracker options.
>  * The tracker options are only using during this call and can safely be freed/reused after this call returns.
>  *
>  * @param ctx The module context.
>  * @param opts The pointer to the tracker options.
>  * @return the tracker uuid or null uuid (uuid_is_null) if unsuccessful.
>  */
> uint64_t bundleContext_trackServicesWithOptions(bundle_context_t *ctx, const celix_service_tracker_options *opts);
> //shortcut could be const celix_service_tracker_options opts = {0};
> /**
>  * Stop the tracker with the provided track id.
>  * Only works for the trackers owned by the bundle of the bundle context.
>  *
>  * @return CELIX_SUCCESS if the tracker is stopped correctly.
>  */
> int bundleContext_stopTracking(bundle_context_t *ctx, uuid_t trackerId); [^bundle_context_additions.h] 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)