Repository: celix
Updated Branches:
  refs/heads/feature/CELIX-269_depman cc6fd4322 -> 664845cac


CELIX-210: Added Set fucntion to dependency manager and added bundle with shell 
command to get overview of the depenency-manages components


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/9203fddd
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/9203fddd
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/9203fddd

Branch: refs/heads/feature/CELIX-269_depman
Commit: 9203fdddd03ebc787544863841069e621bdf7edb
Parents: cc6fd43
Author: Erjan Altena <erjan.alt...@nl.thalesgroup.com>
Authored: Fri Oct 16 14:09:42 2015 +0200
Committer: Pepijn Noltes <pepijnnol...@gmail.com>
Committed: Mon Oct 19 20:44:30 2015 +0200

----------------------------------------------------------------------
 dependency_manager/CMakeLists.txt               |  18 +++-
 .../private/include/dm_component_impl.h         |   2 +-
 .../include/dm_dependency_manager_impl.h        |  11 ++
 .../private/include/dm_server_impl.h            |  10 ++
 .../include/dm_service_dependency_impl.h        |   3 +
 .../private/include/dm_shell_list_command.h     |  34 +++++++
 .../private/src/dm_activator_base.c             |  20 +++-
 .../private/src/dm_component_impl.c             |  19 +++-
 .../private/src/dm_dependency_manager_impl.c    |   6 +-
 dependency_manager/private/src/dm_server.c      |  71 +++++++++++++
 .../private/src/dm_service_dependency.c         |  66 +++++++++++-
 .../private/src/dm_shell_activator.c            |  72 +++++++++++++
 .../private/src/dm_shell_list_command.c         | 101 +++++++++++++++++++
 .../public/include/dm_component.h               |   4 +-
 dependency_manager/public/include/dm_server.h   |  36 +++++++
 .../public/include/dm_service_dependency.h      |   6 +-
 examples/deploy.cmake                           |   2 +-
 .../publisherA/private/src/activator.c          |   2 +
 .../publisherB/private/src/activator.c          |   2 +
 .../tracker_depman/private/include/tracker.h    |   4 +-
 .../private/src/dependency_activator.c          |  18 ++--
 .../tracker_depman/private/src/tracker.c        |  27 ++++-
 22 files changed, 496 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/dependency_manager/CMakeLists.txt 
b/dependency_manager/CMakeLists.txt
index 6b76658..931dd3c 100644
--- a/dependency_manager/CMakeLists.txt
+++ b/dependency_manager/CMakeLists.txt
@@ -16,7 +16,10 @@
 # under the License.
 
 celix_subproject(DEPENDENCY_MANAGER "Option to build the dependency manager 
static library" ON DEPS framework)
-if (DEPENDENCY_MANAGER) 
+if (DEPENDENCY_MANAGER)
+    SET(BUNDLE_SYMBOLICNAME "apache_celix_dm_shell")
+    SET(BUNDLE_VERSION "0.0.1")
+    SET(BUNDLE_NAME "Apache Celix DM Shell commands")
     # Add -fPIC for x86_64 Unix platforms; this lib will be linked to a shared 
lib
     if(UNIX AND NOT WIN32)
       find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin )
@@ -34,15 +37,22 @@ if (DEPENDENCY_MANAGER)
         DESCRIPTION "The Apache Celix dependency manager (static) library"
         GROUP all
     )
-    
+    bundle(dm_shell SOURCES
+            private/src/dm_shell_activator
+            private/src/dm_shell_list_command
+    )
     add_library(dependency_manager STATIC 
        private/src/dm_activator_base 
        private/src/dm_component_impl 
        private/src/dm_service_dependency
        private/src/dm_event
-       private/src/dm_dependency_manager_impl)
+       private/src/dm_dependency_manager_impl
+        private/src/dm_server
+    )
+
        include_directories("public/include")
        include_directories("private/include")
+    include_directories("../shell/public/include")
     include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
     target_link_libraries(dependency_manager celix_framework)
     
@@ -52,10 +62,12 @@ if (DEPENDENCY_MANAGER)
             public/include/dm_component.h
             public/include/dm_dependency_manager.h
             public/include/dm_service_dependency.h
+            public/include/dm_server.h
                DESTINATION 
                        include/celix/dependency_manager
                COMPONENT 
                        dependency_manager
        )
+    install_bundle(dm_shell)
     install(TARGETS dependency_manager DESTINATION lib COMPONENT 
dependency_manager)
 endif (DEPENDENCY_MANAGER)

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/include/dm_component_impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager/private/include/dm_component_impl.h 
b/dependency_manager/private/include/dm_component_impl.h
index 133ef06..ad742b8 100644
--- a/dependency_manager/private/include/dm_component_impl.h
+++ b/dependency_manager/private/include/dm_component_impl.h
@@ -60,7 +60,7 @@ struct dm_component {
     init_fpt callbackInit;
     start_fpt callbackStart;
     stop_fpt callbackStop;
-    destroy_fpt callbackDestroy;
+    deinit_fpt callbackDeinit;
 
     array_list_pt dependencies;
     pthread_mutex_t mutex;

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/include/dm_dependency_manager_impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager/private/include/dm_dependency_manager_impl.h 
b/dependency_manager/private/include/dm_dependency_manager_impl.h
new file mode 100644
index 0000000..8a0cae8
--- /dev/null
+++ b/dependency_manager/private/include/dm_dependency_manager_impl.h
@@ -0,0 +1,11 @@
+
+#ifndef CELIX_DM_DEPENDENCY_MANAGER_IMPL_H
+#define CELIX_DM_DEPENDENCY_MANAGER_IMPL_H
+
+struct dm_dependency_manager {
+    array_list_pt components;
+
+    pthread_mutex_t mutex;
+};
+
+#endif //CELIX_DM_DEPENDENCY_MANAGER_IMPL_H

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/include/dm_server_impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager/private/include/dm_server_impl.h 
b/dependency_manager/private/include/dm_server_impl.h
new file mode 100644
index 0000000..f54aece
--- /dev/null
+++ b/dependency_manager/private/include/dm_server_impl.h
@@ -0,0 +1,10 @@
+#include "dm_server.h"
+#include "dm_component.h"
+#include "dm_component_impl.h"
+#include "dm_dependency_manager_impl.h"
+
+celix_status_t dmServiceCreate(dm_server_pt * dmServ, bundle_context_pt 
context, struct dm_dependency_manager *manager);
+celix_status_t dmServiceAddComponent(dm_server_pt dmServ, dm_component_pt 
component);
+celix_status_t dmServiceDestroy(dm_server_pt dmServ);
+celix_status_t dmService_getInfo(dm_server_pt dmServ, dm_info_pt info);
+

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/include/dm_service_dependency_impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager/private/include/dm_service_dependency_impl.h 
b/dependency_manager/private/include/dm_service_dependency_impl.h
index 1396f31..0f80cef 100644
--- a/dependency_manager/private/include/dm_service_dependency_impl.h
+++ b/dependency_manager/private/include/dm_service_dependency_impl.h
@@ -41,11 +41,13 @@ struct dm_service_dependency {
        bool instanceBound;
        bool required;
 
+       service_set_fpt set;
        service_add_fpt add;
        service_change_fpt change;
        service_remove_fpt remove;
        service_swap_fpt swap;
 
+       service_set_with_ref_fpt set_with_ref;
        service_add_with_ref_fpt add_with_ref;
        service_change_with_ref_fpt change_with_ref;
        service_remove_with_ref_fpt remove_with_ref;
@@ -73,6 +75,7 @@ celix_status_t 
serviceDependency_setAvailable(dm_service_dependency_pt dependenc
 celix_status_t serviceDependency_setComponent(dm_service_dependency_pt 
dependency, dm_component_pt component);
 //celix_status_t serviceDependency_removeComponent(dm_service_dependency_pt 
dependency, dm_component_pt component);
 
+celix_status_t serviceDependency_invokeSet(dm_service_dependency_pt 
dependency, dm_event_pt event);
 celix_status_t serviceDependency_invokeAdd(dm_service_dependency_pt 
dependency, dm_event_pt event);
 celix_status_t serviceDependency_invokeChange(dm_service_dependency_pt 
dependency, dm_event_pt event);
 celix_status_t serviceDependency_invokeRemove(dm_service_dependency_pt 
dependency, dm_event_pt event);

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/include/dm_shell_list_command.h
----------------------------------------------------------------------
diff --git a/dependency_manager/private/include/dm_shell_list_command.h 
b/dependency_manager/private/include/dm_shell_list_command.h
new file mode 100644
index 0000000..28482e0
--- /dev/null
+++ b/dependency_manager/private/include/dm_shell_list_command.h
@@ -0,0 +1,34 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you under the Apache License, Version 2.0 (the
+ *"License"); you may not use this file except in compliance
+ *with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *Unless required by applicable law or agreed to in writing,
+ *software distributed under the License is distributed on an
+ *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ *specific language governing permissions and limitations
+ *under the License.
+ */
+/*
+ * help_command.c
+ *
+ *  \date       Aug 20, 2010
+ *  \author            <a href="mailto:d...@celix.apache.org";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <string.h>
+
+#include "command_impl.h"
+
+char * dmListCommand_getName(command_pt command);
+char * dmListCommand_getUsage(command_pt command);
+char * dmListCommand_getShortDescription(command_pt command);
+void dmListCommand_execute(command_pt command, char * line, void (*out)(char 
*), void (*err)(char *));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_activator_base.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_activator_base.c 
b/dependency_manager/private/src/dm_activator_base.c
index a97194e..1c00ab1 100644
--- a/dependency_manager/private/src/dm_activator_base.c
+++ b/dependency_manager/private/src/dm_activator_base.c
@@ -30,11 +30,14 @@
 
 #include "bundle_activator.h"
 #include "dm_activator_base.h"
-
+#include "dm_server.h"
+#include "dm_server_impl.h"
 
 struct dm_dependency_activator_base {
        dm_dependency_manager_pt manager;
        bundle_context_pt context;
+       dm_service_pt dmService;
+       service_registration_pt reg;
        void* userData;
 };
 
@@ -67,6 +70,11 @@ celix_status_t bundleActivator_start(void * userData, 
bundle_context_pt context)
                dm_init(dependency_activator->userData, context, 
dependency_activator->manager);
        }
 
+       //Create the service
+       dependency_activator->dmService = 
calloc(sizeof(*(dependency_activator->dmService)), 1);
+       dependency_activator->dmService->getInfo = dmService_getInfo;
+       dmServiceCreate(&(dependency_activator->dmService->server), context, 
dependency_activator->manager);
+       bundleContext_registerService(context, DM_SERVICE_NAME, 
dependency_activator->dmService, NULL, &(dependency_activator->reg));
        return status;
 }
 
@@ -74,12 +82,18 @@ celix_status_t bundleActivator_stop(void * userData, 
bundle_context_pt context _
        celix_status_t status = CELIX_SUCCESS;
        dependency_activator_base_pt dependency_activator = 
(dependency_activator_base_pt) userData;
 
-       dm_deinit(dependency_activator->userData, 
dependency_activator->context, dependency_activator->manager);
+       dm_destroy(dependency_activator->userData, 
dependency_activator->context, dependency_activator->manager);
 
        dependencyManager_destroy(&dependency_activator->manager);
 
+       // Remove the service
+       serviceRegistration_unregister(dependency_activator->reg);
+       dmServiceDestroy(dependency_activator->dmService->server);
+       free(dependency_activator->dmService);
+
        dependency_activator->userData = NULL;
        dependency_activator->manager = NULL;
+       dependency_activator->dmService = NULL;
 
        return status;
 }
@@ -88,8 +102,6 @@ celix_status_t bundleActivator_destroy(void * userData, 
bundle_context_pt contex
        celix_status_t status = CELIX_SUCCESS;
        dependency_activator_base_pt dependency_activator = 
(dependency_activator_base_pt) userData;
 
-       dm_destroy(dependency_activator->userData, 
dependency_activator->context, dependency_activator->manager);
-
        free(dependency_activator);
 
        return status;

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_component_impl.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_component_impl.c 
b/dependency_manager/private/src/dm_component_impl.c
index 72fe7eb..801d426 100644
--- a/dependency_manager/private/src/dm_component_impl.c
+++ b/dependency_manager/private/src/dm_component_impl.c
@@ -27,7 +27,10 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 
+#include "constants.h"
+#include "filter.h"
 #include "dm_component_impl.h"
 #include "../../../framework/private/include/framework_private.h"
 
@@ -109,7 +112,7 @@ celix_status_t component_create(bundle_context_pt context, 
dm_dependency_manager
         (*component)->callbackInit = NULL;
         (*component)->callbackStart = NULL;
         (*component)->callbackStop = NULL;
-        (*component)->callbackDestroy = NULL;
+        (*component)->callbackDeinit = NULL;
 
 
         arrayList_create(&(*component)->dependencies);
@@ -362,6 +365,7 @@ celix_status_t component_handleAdded(dm_component_pt 
component, dm_service_depen
 
     serviceDependency_setAvailable(dependency, true);
 
+    serviceDependency_invokeSet(dependency, event);
     switch (component->state) {
         case DM_CMP_STATE_WAITING_FOR_REQUIRED: {
             bool required = false;
@@ -418,6 +422,7 @@ celix_status_t component_handleChanged(dm_component_pt 
component, dm_service_dep
         arrayList_add(events, event);
         pthread_mutex_unlock(&component->mutex);
 
+        serviceDependency_invokeSet(dependency, event);
         switch (component->state) {
             case DM_CMP_STATE_TRACKING_OPTIONAL:
                 serviceDependency_invokeChange(dependency, event);
@@ -467,6 +472,8 @@ celix_status_t component_handleRemoved(dm_component_pt 
component, dm_service_dep
         dm_event_pt old = arrayList_remove(events, (unsigned int) index);
         pthread_mutex_unlock(&component->mutex);
 
+        serviceDependency_invokeSet(dependency, event);
+
         switch (component->state) {
             case DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED: {
                 bool instanceBound = false;
@@ -515,6 +522,8 @@ celix_status_t component_handleSwapped(dm_component_pt 
component, dm_service_dep
         arrayList_add(events, newEvent);
         pthread_mutex_unlock(&component->mutex);
 
+        serviceDependency_invokeSet(dependency, event);
+
         switch (component->state) {
             case DM_CMP_STATE_WAITING_FOR_REQUIRED:
                 break;
@@ -746,8 +755,8 @@ celix_status_t component_performTransition(dm_component_pt 
component, dm_compone
     }
 
     if (oldState == DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED && 
newState == DM_CMP_STATE_WAITING_FOR_REQUIRED) {
-       if (component->callbackDestroy) {
-               component->callbackDestroy(component->implementation);
+       if (component->callbackDeinit) {
+               component->callbackDeinit(component->implementation);
        }
         component_invokeRemoveRequiredDependencies(component);
 //            #TODO Add listener support
@@ -1119,14 +1128,14 @@ celix_status_t 
component_unregisterService(dm_component_pt component) {
     return status;
 }
 
-celix_status_t component_setCallbacks(dm_component_pt component, init_fpt 
init, start_fpt start, stop_fpt stop, destroy_fpt destroy) {
+celix_status_t component_setCallbacks(dm_component_pt component, init_fpt 
init, start_fpt start, stop_fpt stop, deinit_fpt deinit) {
        if (component->active) {
                return CELIX_ILLEGAL_STATE;
        }
        component->callbackInit = init;
        component->callbackStart = start;
        component->callbackStop = stop;
-       component->callbackDestroy = destroy;
+       component->callbackDeinit = deinit;
        return CELIX_SUCCESS;
 }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_dependency_manager_impl.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_dependency_manager_impl.c 
b/dependency_manager/private/src/dm_dependency_manager_impl.c
index 28b49e9..265ecf0 100644
--- a/dependency_manager/private/src/dm_dependency_manager_impl.c
+++ b/dependency_manager/private/src/dm_dependency_manager_impl.c
@@ -31,12 +31,8 @@
 
 #include "bundle_context.h"
 #include "dm_component_impl.h"
+#include "dm_dependency_manager_impl.h"
 
-struct dm_dependency_manager {
-       array_list_pt components;
-
-       pthread_mutex_t mutex;
-};
 
 celix_status_t dependencyManager_create(bundle_context_pt context 
__attribute__((unused)), dm_dependency_manager_pt *manager) {
        celix_status_t status = CELIX_ENOMEM;

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_server.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_server.c 
b/dependency_manager/private/src/dm_server.c
new file mode 100644
index 0000000..7f86d8d
--- /dev/null
+++ b/dependency_manager/private/src/dm_server.c
@@ -0,0 +1,71 @@
+#include <stdlib.h>
+
+#include "array_list.h"
+
+#include "dm_server.h"
+#include "dm_component.h"
+#include "dm_component_impl.h"
+#include "dm_dependency_manager_impl.h"
+
+struct dm_server {
+    struct dm_dependency_manager *manager;
+};
+
+celix_status_t dmServiceCreate(dm_server_pt * dmServ, bundle_context_pt 
context, struct dm_dependency_manager *manager) {
+    *dmServ = calloc(sizeof(struct dm_server), 1);
+    (*dmServ)->manager = manager;
+    return CELIX_SUCCESS;
+}
+
+celix_status_t dmServiceDestroy(dm_server_pt dmServ) {
+    free(dmServ);
+    return CELIX_SUCCESS;
+}
+
+celix_status_t dmService_getInfo(dm_server_pt dmServ, dm_info_pt info) {
+    int compCnt;
+    arrayList_create(&(info->components));
+    array_list_pt  compList = dmServ->manager->components;
+
+    for (compCnt = 0; compCnt < arrayList_size(compList); compCnt++) {
+        int i;
+        struct dm_component *component = arrayList_get(compList, compCnt);
+
+        // Create a component info
+        dm_component_info_pt compInfo = calloc(sizeof(*compInfo),1);
+        arrayList_create(&(compInfo->interface_list));
+        arrayList_create(&(compInfo->dependency_list));
+
+        //Fill in the fields of the component
+        char *outstr;
+        asprintf(&outstr, "%p",component->implementation);
+        compInfo->id = outstr;
+        compInfo->active = component->active;
+
+        array_list_pt interfaces = component->dm_interface;
+        array_list_pt dependencies = component->dependencies;
+
+        for(i = 0; i < arrayList_size(interfaces); i++) {
+            dm_interface * interface = arrayList_get(interfaces, i);
+            arrayList_add(compInfo->interface_list, 
strdup(interface->serviceName));
+        }
+
+        for(i = 0; i < arrayList_size(dependencies); i++) {
+            dm_service_dependency_pt  dependency = arrayList_get(dependencies, 
i);
+
+            dependency_info_pt depInfo = calloc(sizeof(*depInfo), 1);
+            depInfo->available = dependency->available;
+            depInfo->required = dependency->required;
+            if(dependency->tracked_filter) {
+                depInfo->interface  = strdup(dependency->tracked_filter);
+            } else {
+                depInfo->interface = strdup(dependency->tracked_service_name);
+            }
+            arrayList_add(compInfo->dependency_list, depInfo);
+        }
+
+        arrayList_add(info->components, compInfo);
+    }
+
+    return CELIX_SUCCESS;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_service_dependency.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_service_dependency.c 
b/dependency_manager/private/src/dm_service_dependency.c
index 8f65ddb..f89dc94 100644
--- a/dependency_manager/private/src/dm_service_dependency.c
+++ b/dependency_manager/private/src/dm_service_dependency.c
@@ -27,12 +27,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <limits.h>
 
 #include "constants.h"
 
 #include "dm_service_dependency_impl.h"
 #include "dm_component_impl.h"
 
+#define DEFAULT_RANKING     0
+
 static celix_status_t serviceDependency_addedService(void *_ptr, 
service_reference_pt reference, void *service);
 static celix_status_t serviceDependency_modifiedService(void *_ptr, 
service_reference_pt reference, void *service);
 static celix_status_t serviceDependency_removedService(void *_ptr, 
service_reference_pt reference, void *service);
@@ -49,6 +52,7 @@ celix_status_t 
serviceDependency_create(dm_service_dependency_pt *dependency_ptr
                (*dependency_ptr)->instanceBound = false;
                (*dependency_ptr)->required = false;
 
+               (*dependency_ptr)->set = NULL;
                (*dependency_ptr)->add = NULL;
                (*dependency_ptr)->change = NULL;
                (*dependency_ptr)->remove = NULL;
@@ -146,7 +150,7 @@ celix_status_t 
serviceDependency_setService(dm_service_dependency_pt dependency,
        return status;
 }
 
-celix_status_t serviceDependency_setCallbacks(dm_service_dependency_pt 
dependency, service_add_fpt add, service_change_fpt change, service_remove_fpt 
remove, service_swap_fpt swap) {
+celix_status_t serviceDependency_setCallbacks(dm_service_dependency_pt 
dependency, service_set_fpt set, service_add_fpt add, service_change_fpt 
change, service_remove_fpt remove, service_swap_fpt swap) {
        celix_status_t status = CELIX_SUCCESS;
 
        if (!dependency) {
@@ -154,6 +158,7 @@ celix_status_t 
serviceDependency_setCallbacks(dm_service_dependency_pt dependenc
        }
 
        if (status == CELIX_SUCCESS) {
+               dependency->set = set;
                dependency->add = add;
                dependency->change = change;
                dependency->remove = remove;
@@ -163,7 +168,7 @@ celix_status_t 
serviceDependency_setCallbacks(dm_service_dependency_pt dependenc
        return status;
 }
 
-celix_status_t 
serviceDependency_setCallbacksWithServiceReference(dm_service_dependency_pt 
dependency, service_add_with_ref_fpt add, service_change_with_ref_fpt change, 
service_remove_with_ref_fpt remove, service_swap_with_ref_fpt swap) {
+celix_status_t 
serviceDependency_setCallbacksWithServiceReference(dm_service_dependency_pt 
dependency, service_set_with_ref_fpt set, service_add_with_ref_fpt add, 
service_change_with_ref_fpt change, service_remove_with_ref_fpt remove, 
service_swap_with_ref_fpt swap) {
        celix_status_t status = CELIX_SUCCESS;
 
        if (!dependency) {
@@ -171,6 +176,7 @@ celix_status_t 
serviceDependency_setCallbacksWithServiceReference(dm_service_dep
        }
 
        if (status == CELIX_SUCCESS) {
+               dependency->set_with_ref = set;
                dependency->add_with_ref = add;
                dependency->change_with_ref = change;
                dependency->remove_with_ref = remove;
@@ -308,6 +314,62 @@ celix_status_t 
serviceDependency_setAvailable(dm_service_dependency_pt dependenc
 
        return status;
 }
+celix_status_t serviceDependency_invokeSet(dm_service_dependency_pt 
dependency, dm_event_pt event) {
+       celix_status_t status = CELIX_SUCCESS;
+       array_list_pt serviceReferences = NULL;
+       int i;
+       int curRanking = INT_MIN;
+       service_reference_pt curServRef = NULL;
+       void *service = NULL;
+
+       serviceReferences = 
serviceTracker_getServiceReferences(dependency->tracker);
+
+       fprintf(stderr,"found %d 
servicereferences\n",arrayList_size(serviceReferences));
+       /* Find the service with the higest ranking */
+       for (i = 0; i < arrayList_size(serviceReferences); i++) {
+               service_reference_pt serviceReference = 
arrayList_get(serviceReferences, i);
+               char *ranking_value;
+               int ranking = 0;
+
+               status = serviceReference_getProperty(serviceReference, ((char 
*)OSGI_FRAMEWORK_SERVICE_RANKING), &ranking_value);
+
+               if(status == CELIX_SUCCESS) {
+                       if (ranking_value == NULL) {
+                               ranking  = DEFAULT_RANKING;
+                       } else {
+                               char *end;
+                               ranking = strtol(ranking_value, &end, 10);
+                               if( end == ranking_value) {
+                                       ranking = DEFAULT_RANKING;
+                               }
+                       }
+
+                       if (ranking > curRanking) {
+                               curRanking = ranking;
+                               curServRef = serviceReference;
+                       }
+               } else {
+                       return status;
+               }
+       }
+
+       if (curServRef) {
+               status = bundleContext_getService(event->context, curServRef, 
&service);
+       } else {
+               service = NULL;
+       }
+
+       fprintf(stderr, "Ranking found: %d service %p\n", curRanking, service);
+
+       if (dependency->set) {
+               dependency->set(dependency->component->implementation, service);
+       }
+       if (dependency->set_with_ref) {
+               dependency->set_with_ref(dependency->component->implementation, 
curServRef, service);
+       }
+
+       return status;
+}
 
 celix_status_t serviceDependency_invokeAdd(dm_service_dependency_pt 
dependency, dm_event_pt event) {
        celix_status_t status = CELIX_SUCCESS;

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_shell_activator.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_shell_activator.c 
b/dependency_manager/private/src/dm_shell_activator.c
new file mode 100644
index 0000000..28b4784
--- /dev/null
+++ b/dependency_manager/private/src/dm_shell_activator.c
@@ -0,0 +1,72 @@
+#include "bundle_context.h"
+#include "service_registration.h"
+#include "command.h"
+
+#include "dm_shell_list_command.h"
+
+struct bundle_instance {
+    service_registration_pt reg;
+    command_pt dmListCmd;
+};
+
+typedef struct bundle_instance * bundle_instance_pt;
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void 
**userData) {
+
+    struct bundle_instance *bi = calloc(sizeof (struct bundle_instance), 1);
+    celix_status_t status = CELIX_SUCCESS;
+
+    if (!bi) {
+        status = CELIX_ENOMEM;
+    }
+    else if (userData == NULL) {
+        status = CELIX_ILLEGAL_ARGUMENT;
+        free(bi);
+    }
+    else {
+        if (status != CELIX_SUCCESS) {
+            printf("DM:LIST Create failed\n");
+            free(bi);
+        }
+
+        (*userData) = bi;
+    }
+
+    return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt 
context) {
+    celix_status_t status = CELIX_SUCCESS;
+    bundle_instance_pt bi = (bundle_instance_pt) userData;
+    command_service_pt commandService = calloc(1, sizeof(*commandService));
+
+    command_pt command = calloc(sizeof(*command),1);
+    command->executeCommand = dmListCommand_execute;
+    command->bundleContext = context;
+    command->handle = NULL;
+    command->name ="dm:list";
+    command->shortDescription ="not_used";
+    command->usage="not_used";
+
+    commandService->getName             = dmListCommand_getName;
+    commandService->command             = command;
+    commandService->executeCommand      = dmListCommand_execute;
+    commandService->getShortDescription = dmListCommand_getShortDescription;
+    commandService->getUsage            = dmListCommand_getUsage;
+
+    bundleContext_registerService(context, (char *) 
OSGI_SHELL_COMMAND_SERVICE_NAME, commandService, NULL, &bi->reg);
+
+    return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt 
context) {
+    bundle_instance_pt bi = (bundle_instance_pt) userData;
+    serviceRegistration_unregister(bi->reg);
+    return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt 
context) {
+    free(userData);
+    return CELIX_SUCCESS;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/private/src/dm_shell_list_command.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_shell_list_command.c 
b/dependency_manager/private/src/dm_shell_list_command.c
new file mode 100644
index 0000000..06e5968
--- /dev/null
+++ b/dependency_manager/private/src/dm_shell_list_command.c
@@ -0,0 +1,101 @@
+/**
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you under the Apache License, Version 2.0 (the
+ *"License"); you may not use this file except in compliance
+ *with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *Unless required by applicable law or agreed to in writing,
+ *software distributed under the License is distributed on an
+ *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ *specific language governing permissions and limitations
+ *under the License.
+ */
+/*
+ * help_command.c
+ *
+ *  \date       Aug 20, 2010
+ *  \author            <a href="mailto:d...@celix.apache.org";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <string.h>
+#include "dm_server.h"
+#include "service_reference.h"
+#include "command_impl.h"
+#include "array_list.h"
+#include "bundle_context.h"
+#include "bundle.h"
+#include "shell.h"
+
+
+void dmListCommand_execute(command_pt command, char * line, void (*out)(char 
*), void (*err)(char *));
+
+
+char * dmListCommand_getName(command_pt command) {
+    return "dm:list";
+}
+
+char * dmListCommand_getUsage(command_pt command) {
+    return "dm:list";
+}
+
+char * dmListCommand_getShortDescription(command_pt command) {
+    return "Get an overview of the dependency-managed components with their 
dependencies.";
+}
+
+void dmListCommand_execute(command_pt command, char * line, void (*out)(char 
*), void (*err)(char *)) {
+    char outString[256];
+    array_list_pt servRefs = NULL;
+    int i;
+    bundleContext_getServiceReferences(command->bundleContext, DM_SERVICE_NAME 
,NULL, &servRefs);
+
+    for(i = 0; i < arrayList_size(servRefs); i++) {
+        struct dm_info info;
+        dm_service_pt dmService = NULL;
+        service_reference_pt servRef = NULL;
+        servRef = arrayList_get(servRefs, i);
+        bundleContext_getService(command->bundleContext,  servRef, 
(void**)&dmService);
+        dmService->getInfo(dmService->server, &info);
+
+        int cmpCnt;
+        for (cmpCnt = 0; cmpCnt < arrayList_size(info.components); cmpCnt++) {
+            dm_component_info_pt compInfo = arrayList_get(info.components, 
cmpCnt);
+            sprintf(outString, "Component: ID=%s, Active=%s\n", compInfo->id, 
compInfo->active ? "true" : "false");
+            out(outString);
+
+            int interfCnt;
+            sprintf(outString, "    Interfaces (%d):\n", 
arrayList_size(compInfo->interface_list));
+            out(outString);
+            for(interfCnt = 0 ;interfCnt < 
arrayList_size(compInfo->interface_list); interfCnt++) {
+                char * interface;
+                interface = arrayList_get(compInfo->interface_list, interfCnt);
+                sprintf(outString, "        Interface: %s\n", interface);
+                out(outString);
+                free(interface);
+            }
+            arrayList_destroy(compInfo->interface_list);
+
+            int depCnt;
+            sprintf(outString, "    Dependencies (%d):\n", 
arrayList_size(compInfo->dependency_list));
+            out(outString);
+            for(depCnt = 0 ;depCnt < 
arrayList_size(compInfo->dependency_list); depCnt++) {
+                dependency_info_pt dependency;
+                dependency = arrayList_get(compInfo->dependency_list, depCnt);
+                sprintf(outString, "         Dependency: Available = %s, 
Required = %s, Filter = %s\n",
+                        dependency->available? "true" : "false" ,
+                        dependency->required ? "true" : "false",
+                        dependency->interface);
+                out(outString);
+                free(dependency->interface);
+                free(dependency);
+            }
+            arrayList_destroy(compInfo->dependency_list);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/public/include/dm_component.h
----------------------------------------------------------------------
diff --git a/dependency_manager/public/include/dm_component.h 
b/dependency_manager/public/include/dm_component.h
index f98c3bb..6b875b2 100644
--- a/dependency_manager/public/include/dm_component.h
+++ b/dependency_manager/public/include/dm_component.h
@@ -38,7 +38,7 @@ typedef struct dm_component *dm_component_pt;
 typedef celix_status_t (*init_fpt)(void *userData);
 typedef celix_status_t (*start_fpt)(void *userData);
 typedef celix_status_t (*stop_fpt)(void *userData);
-typedef celix_status_t (*destroy_fpt)(void *userData);
+typedef celix_status_t (*deinit_fpt)(void *userData);
 
 celix_status_t component_create(bundle_context_pt context, 
dm_dependency_manager_pt manager, dm_component_pt *component);
 celix_status_t component_destroy(dm_component_pt *component);
@@ -49,6 +49,6 @@ celix_status_t component_setImplementation(dm_component_pt 
component, void *impl
 celix_status_t component_addServiceDependency(dm_component_pt component, ...);
 celix_status_t component_removeServiceDependency(dm_component_pt component, 
dm_service_dependency_pt dependency);
 
-celix_status_t component_setCallbacks(dm_component_pt component, init_fpt 
init, start_fpt start, stop_fpt, destroy_fpt);
+celix_status_t component_setCallbacks(dm_component_pt component, init_fpt 
init, start_fpt start, stop_fpt stop, deinit_fpt deinit);
 
 #endif /* COMPONENT_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/public/include/dm_server.h
----------------------------------------------------------------------
diff --git a/dependency_manager/public/include/dm_server.h 
b/dependency_manager/public/include/dm_server.h
new file mode 100644
index 0000000..fa8da78
--- /dev/null
+++ b/dependency_manager/public/include/dm_server.h
@@ -0,0 +1,36 @@
+
+#ifndef CELIX_DM_SERVICE_H
+#define CELIX_DM_SERVICE_H
+
+#include "bundle_context.h"
+
+#define DM_SERVICE_NAME "dm_server"
+
+typedef struct dm_server * dm_server_pt;
+
+typedef struct dependency_info {
+    char *interface;
+    bool available;
+    bool required;
+} * dependency_info_pt;
+
+typedef struct dm_component_info {
+    char *id;
+    bool active;
+    array_list_pt interface_list;       // type char*
+    array_list_pt dependency_list;  // type interface_info_pt
+} * dm_component_info_pt;
+
+typedef struct dm_info {
+    array_list_pt  components;      // type dm_component_info
+} * dm_info_pt;
+
+struct dm_service {
+    dm_server_pt server;
+    celix_status_t (*getInfo)(dm_server_pt server, dm_info_pt info);
+};
+
+typedef struct dm_service * dm_service_pt;
+
+
+#endif //CELIX_DM_SERVICE_H

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/dependency_manager/public/include/dm_service_dependency.h
----------------------------------------------------------------------
diff --git a/dependency_manager/public/include/dm_service_dependency.h 
b/dependency_manager/public/include/dm_service_dependency.h
index e9a5513..f267ab7 100644
--- a/dependency_manager/public/include/dm_service_dependency.h
+++ b/dependency_manager/public/include/dm_service_dependency.h
@@ -33,11 +33,13 @@ typedef struct dm_service_dependency 
*dm_service_dependency_pt;
 
 #include "dm_component.h"
 
+typedef celix_status_t (*service_set_fpt)(void *handle, void *service);
 typedef celix_status_t (*service_add_fpt)(void *handle, void *service);
 typedef celix_status_t (*service_change_fpt)(void *handle, void *service);
 typedef celix_status_t (*service_remove_fpt)(void *handle, void *service);
 typedef celix_status_t (*service_swap_fpt)(void *handle, void *oldService, 
void *newService);
 
+typedef celix_status_t (*service_set_with_ref_fpt)(void *handle, 
service_reference_pt reference, void *service);
 typedef celix_status_t (*service_add_with_ref_fpt)(void *handle, 
service_reference_pt reference, void *service);
 typedef celix_status_t (*service_change_with_ref_fpt)(void *handle, 
service_reference_pt reference, void *service);
 typedef celix_status_t (*service_remove_with_ref_fpt)(void *handle, 
service_reference_pt reference, void *service);
@@ -48,8 +50,8 @@ celix_status_t 
serviceDependency_destroy(dm_service_dependency_pt *dependency_pt
 
 celix_status_t serviceDependency_setRequired(dm_service_dependency_pt 
dependency, bool required);
 celix_status_t serviceDependency_setService(dm_service_dependency_pt 
dependency, char *serviceName, char *filter);
-celix_status_t serviceDependency_setCallbacks(dm_service_dependency_pt 
dependency, service_add_fpt add, service_change_fpt change, service_remove_fpt 
remove, service_swap_fpt swap);
-celix_status_t 
serviceDependency_setCallbacksWithServiceReference(dm_service_dependency_pt 
dependency, service_add_with_ref_fpt add, service_change_with_ref_fpt change, 
service_remove_with_ref_fpt remove, service_swap_with_ref_fpt swap);
+celix_status_t serviceDependency_setCallbacks(dm_service_dependency_pt 
dependency, service_set_fpt set, service_add_fpt add, service_change_fpt 
change, service_remove_fpt remove, service_swap_fpt swap);
+celix_status_t 
serviceDependency_setCallbacksWithServiceReference(dm_service_dependency_pt 
dependency, service_set_with_ref_fpt set, service_add_with_ref_fpt add, 
service_change_with_ref_fpt change, service_remove_with_ref_fpt remove, 
service_swap_with_ref_fpt swap);
 celix_status_t serviceDependency_setAutoConfigure(dm_service_dependency_pt 
dependency, celix_thread_mutex_t *service_lock, void **field);
 
 #endif /* DM_SERVICE_DEPENDENCY_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/deploy.cmake
----------------------------------------------------------------------
diff --git a/examples/deploy.cmake b/examples/deploy.cmake
index a8d97a1..24c7a11 100644
--- a/examples/deploy.cmake
+++ b/examples/deploy.cmake
@@ -22,7 +22,7 @@ if (EXAMPLES)
        
        deploy("hello_world" BUNDLES shell shell_tui 
apache_celix_examples_hello_world hello_world_test log_service log_writer)
        deploy("wb" BUNDLES tracker publisherA publisherB shell shell_tui 
log_service log_writer)
-       deploy("wb_dp" BUNDLES tracker_depman publisherA publisherB shell 
shell_tui log_service log_writer)
+       deploy("wb_dp" BUNDLES tracker_depman publisherA publisherB shell 
shell_tui log_service log_writer dm_shell)
        deploy("echo" BUNDLES echo_server echo_client shell shell_tui)
        deploy("producer_consumer" BUNDLES producer consumer database shell 
shell_tui)
        if (NOT ANDROID)

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/whiteboard/publisherA/private/src/activator.c
----------------------------------------------------------------------
diff --git a/examples/whiteboard/publisherA/private/src/activator.c 
b/examples/whiteboard/publisherA/private/src/activator.c
index fd749d0..663b0b9 100644
--- a/examples/whiteboard/publisherA/private/src/activator.c
+++ b/examples/whiteboard/publisherA/private/src/activator.c
@@ -24,6 +24,7 @@
  *  \copyright Apache License, Version 2.0
  */
 #include <stdlib.h>
+#include <constants.h>
 
 #include "bundle_activator.h"
 #include "publisher_private.h"
@@ -53,6 +54,7 @@ celix_status_t bundleActivator_start(void * userData, 
bundle_context_pt context)
 
        props = properties_create();
        properties_set(props, "id", "A");
+       properties_set(props,(char*)OSGI_FRAMEWORK_SERVICE_RANKING , "10");
 
        status = bundleContext_registerService(context, PUBLISHER_NAME, 
data->ps, props, &data->reg);
        if (status != CELIX_SUCCESS) {

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/whiteboard/publisherB/private/src/activator.c
----------------------------------------------------------------------
diff --git a/examples/whiteboard/publisherB/private/src/activator.c 
b/examples/whiteboard/publisherB/private/src/activator.c
index 06fea8d..f5f1a2e 100644
--- a/examples/whiteboard/publisherB/private/src/activator.c
+++ b/examples/whiteboard/publisherB/private/src/activator.c
@@ -24,6 +24,7 @@
  *  \copyright Apache License, Version 2.0
  */
 #include <stdlib.h>
+#include <constants.h>
 
 #include "bundle_activator.h"
 #include "publisher_private.h"
@@ -52,6 +53,7 @@ celix_status_t bundleActivator_start(void * userData, 
bundle_context_pt context)
        data->reg = NULL;
 
        properties_set(props, "id", "B");
+       properties_set(props,(char*)OSGI_FRAMEWORK_SERVICE_RANKING , "20");
 
        bundleContext_registerService(context, PUBLISHER_NAME, data->ps, props, 
&data->reg);
     return status;

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/whiteboard/tracker_depman/private/include/tracker.h
----------------------------------------------------------------------
diff --git a/examples/whiteboard/tracker_depman/private/include/tracker.h 
b/examples/whiteboard/tracker_depman/private/include/tracker.h
index 5918e91..3b078ca 100644
--- a/examples/whiteboard/tracker_depman/private/include/tracker.h
+++ b/examples/whiteboard/tracker_depman/private/include/tracker.h
@@ -44,10 +44,12 @@ struct data {
        celix_thread_mutex_t publisher_lock;
 };
 
+celix_status_t tracker_setServ(void * handle, service_reference_pt ref, void * 
service);
 celix_status_t tracker_addedServ(void * handle, service_reference_pt ref, void 
* service);
 celix_status_t tracker_modifiedServ(void * handle, service_reference_pt ref, 
void * service);
 celix_status_t tracker_removedServ(void * handle, service_reference_pt ref, 
void * service);
 
+celix_status_t tracker_setLog(void * handle, service_reference_pt ref, void * 
service);
 celix_status_t tracker_addLog(void * handle, service_reference_pt ref, void * 
service);
 celix_status_t tracker_modifiedLog(void * handle, service_reference_pt ref, 
void * service);
 celix_status_t tracker_removeLog(void * handle, service_reference_pt ref, void 
* service);
@@ -55,7 +57,7 @@ celix_status_t tracker_removeLog(void * handle, 
service_reference_pt ref, void *
 celix_status_t service_init(void * userData);
 celix_status_t service_start(void * userData);
 celix_status_t service_stop(void * userData);
-celix_status_t service_destroy(void * userData);
+celix_status_t service_deinit(void * userData);
 
 
 #endif /* TRACKER_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/whiteboard/tracker_depman/private/src/dependency_activator.c
----------------------------------------------------------------------
diff --git 
a/examples/whiteboard/tracker_depman/private/src/dependency_activator.c 
b/examples/whiteboard/tracker_depman/private/src/dependency_activator.c
index 84194f8..5dd8d1e 100644
--- a/examples/whiteboard/tracker_depman/private/src/dependency_activator.c
+++ b/examples/whiteboard/tracker_depman/private/src/dependency_activator.c
@@ -49,30 +49,30 @@ celix_status_t dm_init(void * userData, bundle_context_pt 
context, dm_dependency
        printf("Init\n");
        struct data * data = (struct data *) userData;
        dm_component_pt service = NULL;
-       dm_service_dependency_pt dep = NULL;
+       dm_service_dependency_pt dep1 = NULL;
        dm_service_dependency_pt dep2 = NULL;
 
        data->context = context;
 
        component_create(context, manager, &service);
        component_setImplementation(service, data);
-       component_setCallbacks(service, service_init, service_start, 
service_stop, service_destroy);
+       component_setCallbacks(service, service_init, service_start, 
service_stop, service_deinit);
 
-       serviceDependency_create(&dep);
-       serviceDependency_setRequired(dep, false);
-       serviceDependency_setService(dep, PUBLISHER_NAME, "(|(id=A)(id=B))");
-       serviceDependency_setCallbacksWithServiceReference(dep, 
tracker_addedServ, tracker_modifiedServ, tracker_removedServ, NULL);
-       component_addServiceDependency(service, dep, NULL);
+       serviceDependency_create(&dep1);
+       serviceDependency_setRequired(dep1, true);
+       serviceDependency_setService(dep1, PUBLISHER_NAME, "(|(id=A)(id=B))");
+       serviceDependency_setCallbacksWithServiceReference(dep1, NULL 
/*tracker_setServ*/, tracker_addedServ, tracker_modifiedServ, 
tracker_removedServ, NULL);
+       component_addServiceDependency(service, dep1, NULL);
 
        serviceDependency_create(&dep2);
     serviceDependency_setRequired(dep2, false);
     serviceDependency_setService(dep2, (char *) OSGI_LOGSERVICE_NAME, NULL);
-    serviceDependency_setCallbacksWithServiceReference(dep2, tracker_addLog, 
tracker_modifiedLog, tracker_removeLog, NULL);
+    serviceDependency_setCallbacksWithServiceReference(dep2, NULL  
/*tracker_setLog*/, tracker_addLog, tracker_modifiedLog, tracker_removeLog, 
NULL);
        serviceDependency_setAutoConfigure(dep2, &data->logger_lock, (void **) 
&data->logger);
     component_addServiceDependency(service, dep2, NULL);
 
        data->service = service;
-       data->dep = dep;
+       data->dep = dep1;
        data->dep2 = dep2;
 
        dependencyManager_add(manager, service);

http://git-wip-us.apache.org/repos/asf/celix/blob/9203fddd/examples/whiteboard/tracker_depman/private/src/tracker.c
----------------------------------------------------------------------
diff --git a/examples/whiteboard/tracker_depman/private/src/tracker.c 
b/examples/whiteboard/tracker_depman/private/src/tracker.c
index 2605609..0ada638 100644
--- a/examples/whiteboard/tracker_depman/private/src/tracker.c
+++ b/examples/whiteboard/tracker_depman/private/src/tracker.c
@@ -56,12 +56,13 @@ static void *dp_send(void *handle) {
 }
 
 celix_status_t service_init(void * userData) {
+       fprintf(stderr, "Service init");
        return CELIX_SUCCESS;
 }
 
 celix_status_t service_start(void * userData) {
        struct data * data = (struct data *) userData;
-
+       fprintf(stderr, "Service started");
        data->running = true;
        pthread_create(&data->sender, NULL, dp_send, data);
        return CELIX_SUCCESS;
@@ -69,15 +70,23 @@ celix_status_t service_start(void * userData) {
 
 celix_status_t service_stop(void * userData) {
        struct data * data = (struct data *) userData;
+       fprintf(stderr, "Service stopped");
        data->running = false;
        pthread_join(data->sender, NULL);
        return CELIX_SUCCESS;
 }
 
-celix_status_t service_destroy(void * userData) {
+celix_status_t service_deinit(void * userData) {
+       fprintf(stderr, "Service deinit");
+       return CELIX_SUCCESS;
+}
+
+celix_status_t tracker_setServ(void * handle, service_reference_pt ref, void * 
service) {
+       printf("Service Set %p\n", service);
        return CELIX_SUCCESS;
 }
 
+
 celix_status_t tracker_addedServ(void * handle, service_reference_pt ref, void 
* service) {
        struct data * data = (struct data *) handle;
        arrayList_add(data->publishers, service);
@@ -97,9 +106,21 @@ celix_status_t tracker_removedServ(void * handle, 
service_reference_pt ref, void
        return CELIX_SUCCESS;
 }
 
+celix_status_t tracker_setLog(void *handle, service_reference_pt ref, void 
*service) {
+       struct data * data = (struct data *) handle;
+
+       printf("SET log %p\n", service);
+       if(service) {
+               data->logger = service;
+               ((log_service_pt) service)->log(((log_service_pt) 
service)->logger, OSGI_LOGSERVICE_DEBUG, "SET log");
+       }
+       fprintf(stderr, "SET end %p\n", service);
+       return CELIX_SUCCESS;
+}
+
 celix_status_t tracker_addLog(void *handle, service_reference_pt ref, void 
*service) {
     struct data * data = (struct data *) handle;
-    printf("Add log\n");
+    printf("Add log %p\n", service);
     data->logger = service;
     ((log_service_pt) service)->log(((log_service_pt) service)->logger, 
OSGI_LOGSERVICE_DEBUG, "test");
     return CELIX_SUCCESS;

Reply via email to