http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/pubsub/pubsub_topology_manager/src/pstm_activator.c
----------------------------------------------------------------------
diff --git a/pubsub/pubsub_topology_manager/src/pstm_activator.c 
b/pubsub/pubsub_topology_manager/src/pstm_activator.c
new file mode 100644
index 0000000..eb874fe
--- /dev/null
+++ b/pubsub/pubsub_topology_manager/src/pstm_activator.c
@@ -0,0 +1,244 @@
+/**
+ *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.
+ */
+/*
+ * pstm_activator.c
+ *
+ *  \date       Sep 29, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "constants.h"
+#include "bundle_activator.h"
+#include "service_tracker.h"
+#include "service_registration.h"
+
+#include "listener_hook_service.h"
+#include "log_service.h"
+#include "log_helper.h"
+
+
+#include "pubsub_topology_manager.h"
+#include "publisher_endpoint_announce.h"
+
+struct activator {
+       bundle_context_pt context;
+
+       pubsub_topology_manager_pt manager;
+
+       service_tracker_pt pubsubDiscoveryTracker;
+       service_tracker_pt pubsubAdminTracker;
+       service_tracker_pt pubsubSubscribersTracker;
+
+       listener_hook_service_pt hookService;
+       service_registration_pt hook;
+
+       publisher_endpoint_announce_pt publisherEPDiscover;
+       service_registration_pt publisherEPDiscoverService;
+
+       log_helper_pt loghelper;
+};
+
+
+static celix_status_t bundleActivator_createPSDTracker(struct activator 
*activator, service_tracker_pt *tracker);
+static celix_status_t bundleActivator_createPSATracker(struct activator 
*activator, service_tracker_pt *tracker);
+static celix_status_t bundleActivator_createPSSubTracker(struct activator 
*activator, service_tracker_pt *tracker);
+
+
+static celix_status_t bundleActivator_createPSDTracker(struct activator 
*activator, service_tracker_pt *tracker) {
+       celix_status_t status;
+
+       service_tracker_customizer_pt customizer = NULL;
+
+       status = serviceTrackerCustomizer_create(activator->manager,
+                       NULL,
+                       pubsub_topologyManager_pubsubDiscoveryAdded,
+                       pubsub_topologyManager_pubsubDiscoveryModified,
+                       pubsub_topologyManager_pubsubDiscoveryRemoved,
+                       &customizer);
+
+       if (status == CELIX_SUCCESS) {
+               status = serviceTracker_create(activator->context, (char *) 
PUBSUB_DISCOVERY_SERVICE, customizer, tracker);
+       }
+
+       return status;
+}
+
+static celix_status_t bundleActivator_createPSATracker(struct activator 
*activator, service_tracker_pt *tracker) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       service_tracker_customizer_pt customizer = NULL;
+
+       status = serviceTrackerCustomizer_create(activator->manager,
+                       NULL,
+                       pubsub_topologyManager_psaAdded,
+                       pubsub_topologyManager_psaModified,
+                       pubsub_topologyManager_psaRemoved,
+                       &customizer);
+
+       if (status == CELIX_SUCCESS) {
+               status = serviceTracker_create(activator->context, 
PUBSUB_ADMIN_SERVICE, customizer, tracker);
+       }
+
+       return status;
+}
+
+static celix_status_t bundleActivator_createPSSubTracker(struct activator 
*activator, service_tracker_pt *tracker) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       service_tracker_customizer_pt customizer = NULL;
+
+       status = serviceTrackerCustomizer_create(activator->manager,
+                       NULL,
+                       pubsub_topologyManager_subscriberAdded,
+                       pubsub_topologyManager_subscriberModified,
+                       pubsub_topologyManager_subscriberRemoved,
+                       &customizer);
+
+       if (status == CELIX_SUCCESS) {
+               status = serviceTracker_create(activator->context, 
PUBSUB_SUBSCRIBER_SERVICE_NAME, customizer, tracker);
+       }
+
+       return status;
+}
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void 
**userData) {
+       celix_status_t status = CELIX_SUCCESS;
+       struct activator *activator = NULL;
+
+       activator = calloc(1,sizeof(struct activator));
+
+       if (!activator) {
+               return CELIX_ENOMEM;
+       }
+
+       activator->context = context;
+
+       logHelper_create(context, &activator->loghelper);
+       logHelper_start(activator->loghelper);
+
+       status = pubsub_topologyManager_create(context, activator->loghelper, 
&activator->manager);
+       if (status == CELIX_SUCCESS) {
+               status = bundleActivator_createPSDTracker(activator, 
&activator->pubsubDiscoveryTracker);
+               if (status == CELIX_SUCCESS) {
+                       status = bundleActivator_createPSATracker(activator, 
&activator->pubsubAdminTracker);
+                       if (status == CELIX_SUCCESS) {
+                               status = 
bundleActivator_createPSSubTracker(activator, 
&activator->pubsubSubscribersTracker);
+                               if (status == CELIX_SUCCESS) {
+                                       *userData = activator;
+                               }
+                       }
+               }
+       }
+
+       if(status != CELIX_SUCCESS){
+               bundleActivator_destroy(activator, context);
+       }
+
+       return status;
+}
+
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt 
context) {
+       celix_status_t status = CELIX_SUCCESS;
+       struct activator *activator = userData;
+
+       publisher_endpoint_announce_pt pubEPDiscover = calloc(1, 
sizeof(*pubEPDiscover));
+       pubEPDiscover->handle = activator->manager;
+       pubEPDiscover->announcePublisher = 
pubsub_topologyManager_announcePublisher;
+       pubEPDiscover->removePublisher = pubsub_topologyManager_removePublisher;
+       activator->publisherEPDiscover = pubEPDiscover;
+
+       status += bundleContext_registerService(context, (char *) 
PUBSUB_TM_ANNOUNCE_PUBLISHER_SERVICE, pubEPDiscover, NULL, 
&activator->publisherEPDiscoverService);
+
+
+       listener_hook_service_pt hookService = calloc(1,sizeof(*hookService));
+       hookService->handle = activator->manager;
+       hookService->added = pubsub_topologyManager_publisherTrackerAdded;
+       hookService->removed = pubsub_topologyManager_publisherTrackerRemoved;
+       activator->hookService = hookService;
+
+       status += bundleContext_registerService(context, (char *) 
OSGI_FRAMEWORK_LISTENER_HOOK_SERVICE_NAME, hookService, NULL, &activator->hook);
+
+       /* NOTE: Enable those line in order to remotely expose the topic_info 
service
+       properties_pt props = properties_create();
+       properties_set(props, (char *) OSGI_RSA_SERVICE_EXPORTED_INTERFACES, 
(char *) PUBSUB_TOPIC_INFO_SERVICE);
+       status += bundleContext_registerService(context, (char *) 
PUBSUB_TOPIC_INFO_SERVICE, activator->topicInfo, props, 
&activator->topicInfoService);
+       */
+       status += serviceTracker_open(activator->pubsubAdminTracker);
+
+       status += serviceTracker_open(activator->pubsubDiscoveryTracker);
+
+       status += serviceTracker_open(activator->pubsubSubscribersTracker);
+
+
+       return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt 
context) {
+       celix_status_t status = CELIX_SUCCESS;
+       struct activator *activator = userData;
+
+       serviceTracker_close(activator->pubsubSubscribersTracker);
+       serviceTracker_close(activator->pubsubDiscoveryTracker);
+       serviceTracker_close(activator->pubsubAdminTracker);
+
+       serviceRegistration_unregister(activator->publisherEPDiscoverService);
+       free(activator->publisherEPDiscover);
+
+       serviceRegistration_unregister(activator->hook);
+       free(activator->hookService);
+
+       return status;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt 
context) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       struct activator *activator = userData;
+       if (activator == NULL) {
+               status = CELIX_BUNDLE_EXCEPTION;
+       } else {
+
+               if(activator->pubsubSubscribersTracker!=NULL){
+                       
serviceTracker_destroy(activator->pubsubSubscribersTracker);
+               }
+               if(activator->pubsubDiscoveryTracker!=NULL){
+                       
serviceTracker_destroy(activator->pubsubDiscoveryTracker);
+               }
+               if(activator->pubsubAdminTracker!=NULL){
+                       serviceTracker_destroy(activator->pubsubAdminTracker);
+               }
+
+               if(activator->manager!=NULL){
+                       status = 
pubsub_topologyManager_destroy(activator->manager);
+               }
+
+               logHelper_stop(activator->loghelper);
+               logHelper_destroy(&activator->loghelper);
+
+               free(activator);
+       }
+
+       return status;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.c
----------------------------------------------------------------------
diff --git a/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.c 
b/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.c
new file mode 100644
index 0000000..2ac75c9
--- /dev/null
+++ b/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.c
@@ -0,0 +1,721 @@
+/**
+ *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.
+ */
+/*
+ * pubsub_topology_manager.c
+ *
+ *  \date       Sep 29, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "hash_map.h"
+#include "array_list.h"
+#include "bundle_context.h"
+#include "constants.h"
+#include "module.h"
+#include "bundle.h"
+#include "filter.h"
+#include "listener_hook_service.h"
+#include "utils.h"
+#include "service_reference.h"
+#include "service_registration.h"
+#include "log_service.h"
+#include "log_helper.h"
+
+#include "publisher_endpoint_announce.h"
+#include "pubsub_topology_manager.h"
+#include "pubsub_endpoint.h"
+#include "pubsub_admin.h"
+#include "pubsub_utils.h"
+
+
+celix_status_t pubsub_topologyManager_create(bundle_context_pt context, 
log_helper_pt logHelper, pubsub_topology_manager_pt *manager) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *manager = calloc(1, sizeof(**manager));
+       if (!*manager) {
+               return CELIX_ENOMEM;
+       }
+
+       (*manager)->context = context;
+
+       celix_thread_mutexattr_t psaAttr;
+       celixThreadMutexAttr_create(&psaAttr);
+       celixThreadMutexAttr_settype(&psaAttr, CELIX_THREAD_MUTEX_RECURSIVE);
+       status = celixThreadMutex_create(&(*manager)->psaListLock, &psaAttr);
+       celixThreadMutexAttr_destroy(&psaAttr);
+
+       status = celixThreadMutex_create(&(*manager)->publicationsLock, NULL);
+       status = celixThreadMutex_create(&(*manager)->subscriptionsLock, NULL);
+       status = celixThreadMutex_create(&(*manager)->discoveryListLock, NULL);
+
+       arrayList_create(&(*manager)->psaList);
+
+       (*manager)->discoveryList = hashMap_create(serviceReference_hashCode, 
NULL, serviceReference_equals2, NULL);
+       (*manager)->publications = hashMap_create(utils_stringHash, NULL, 
utils_stringEquals, NULL);
+       (*manager)->subscriptions = hashMap_create(utils_stringHash, NULL, 
utils_stringEquals, NULL);
+
+       (*manager)->loghelper = logHelper;
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_destroy(pubsub_topology_manager_pt 
manager) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       celixThreadMutex_lock(&manager->discoveryListLock);
+       hashMap_destroy(manager->discoveryList, false, false);
+       celixThreadMutex_unlock(&manager->discoveryListLock);
+       celixThreadMutex_destroy(&manager->discoveryListLock);
+
+       celixThreadMutex_lock(&manager->psaListLock);
+       arrayList_destroy(manager->psaList);
+       celixThreadMutex_unlock(&manager->psaListLock);
+       celixThreadMutex_destroy(&manager->psaListLock);
+
+       celixThreadMutex_lock(&manager->publicationsLock);
+       hash_map_iterator_pt pubit = 
hashMapIterator_create(manager->publications);
+       while(hashMapIterator_hasNext(pubit)){
+               array_list_pt l = 
(array_list_pt)hashMapIterator_nextValue(pubit);
+               int i;
+               for(i=0;i<arrayList_size(l);i++){
+                       
pubsubEndpoint_destroy((pubsub_endpoint_pt)arrayList_get(l,i));
+               }
+               arrayList_destroy(l);
+       }
+       hashMapIterator_destroy(pubit);
+       hashMap_destroy(manager->publications, true, false);
+       celixThreadMutex_unlock(&manager->publicationsLock);
+       celixThreadMutex_destroy(&manager->publicationsLock);
+
+       celixThreadMutex_lock(&manager->subscriptionsLock);
+       hash_map_iterator_pt subit = 
hashMapIterator_create(manager->subscriptions);
+       while(hashMapIterator_hasNext(subit)){
+               array_list_pt l = 
(array_list_pt)hashMapIterator_nextValue(subit);
+               int i;
+               for(i=0;i<arrayList_size(l);i++){
+                       
pubsubEndpoint_destroy((pubsub_endpoint_pt)arrayList_get(l,i));
+               }
+               arrayList_destroy(l);
+       }
+       hashMapIterator_destroy(subit);
+       hashMap_destroy(manager->subscriptions, true, false);
+       celixThreadMutex_unlock(&manager->subscriptionsLock);
+       celixThreadMutex_destroy(&manager->subscriptionsLock);
+
+       free(manager);
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_psaAdded(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+       int i;
+
+       pubsub_admin_service_pt psa = (pubsub_admin_service_pt) service;
+       logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "PSTM: Added 
PSA");
+
+       celixThreadMutex_lock(&manager->psaListLock);
+       arrayList_add(manager->psaList, psa);
+       celixThreadMutex_unlock(&manager->psaListLock);
+
+       // Add already detected subscriptions to new PSA
+       celixThreadMutex_lock(&manager->subscriptionsLock);
+       hash_map_iterator_pt subscriptionsIterator = 
hashMapIterator_create(manager->subscriptions);
+
+       while (hashMapIterator_hasNext(subscriptionsIterator)) {
+               array_list_pt sub_ep_list = 
hashMapIterator_nextValue(subscriptionsIterator);
+               for(i=0;i<arrayList_size(sub_ep_list);i++){
+                       status += psa->addSubscription(psa->admin, 
(pubsub_endpoint_pt)arrayList_get(sub_ep_list,i));
+               }
+       }
+
+       hashMapIterator_destroy(subscriptionsIterator);
+
+       celixThreadMutex_unlock(&manager->subscriptionsLock);
+
+       // Add already detected publications to new PSA
+       status = celixThreadMutex_lock(&manager->publicationsLock);
+       hash_map_iterator_pt publicationsIterator = 
hashMapIterator_create(manager->publications);
+
+       while (hashMapIterator_hasNext(publicationsIterator)) {
+               array_list_pt pub_ep_list = 
hashMapIterator_nextValue(publicationsIterator);
+               for(i=0;i<arrayList_size(pub_ep_list);i++){
+                       status += psa->addPublication(psa->admin, 
(pubsub_endpoint_pt)arrayList_get(pub_ep_list,i));
+               }
+       }
+
+       hashMapIterator_destroy(publicationsIterator);
+
+       celixThreadMutex_unlock(&manager->publicationsLock);
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_psaModified(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       // Nop...
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_psaRemoved(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+
+       pubsub_admin_service_pt psa = (pubsub_admin_service_pt) service;
+
+       /* Deactivate all publications */
+       celixThreadMutex_lock(&manager->publicationsLock);
+
+       hash_map_iterator_pt pubit = 
hashMapIterator_create(manager->publications);
+       while(hashMapIterator_hasNext(pubit)){
+               hash_map_entry_pt pub_entry = hashMapIterator_nextEntry(pubit);
+               char* scope_topic_key = (char*)hashMapEntry_getKey(pub_entry);
+               // Extract scope/topic name from key
+               char scope[MAX_SCOPE_LEN];
+               char topic[MAX_TOPIC_LEN];
+               sscanf(scope_topic_key, "%[^:]:%s", scope, topic );
+               array_list_pt pubEP_list = 
(array_list_pt)hashMapEntry_getValue(pub_entry);
+
+               status = psa->closeAllPublications(psa->admin,scope,topic);
+
+               if(status==CELIX_SUCCESS){
+                       celixThreadMutex_lock(&manager->discoveryListLock);
+                       hash_map_iterator_pt iter = 
hashMapIterator_create(manager->discoveryList);
+                       while(hashMapIterator_hasNext(iter)){
+                               service_reference_pt disc_sr = 
(service_reference_pt)hashMapIterator_nextKey(iter);
+                               publisher_endpoint_announce_pt disc = NULL;
+                               bundleContext_getService(manager->context, 
disc_sr, (void**) &disc);
+                               const char* fwUUID = NULL;
+                               
bundleContext_getProperty(manager->context,OSGI_FRAMEWORK_FRAMEWORK_UUID,&fwUUID);
+                               int i;
+                               for(i=0;i<arrayList_size(pubEP_list);i++){
+                                       pubsub_endpoint_pt pubEP = 
(pubsub_endpoint_pt)arrayList_get(pubEP_list,i);
+                                       
if(strcmp(pubEP->frameworkUUID,fwUUID)==0){
+                                               
disc->removePublisher(disc->handle,pubEP);
+                                       }
+                               }
+                               bundleContext_ungetService(manager->context, 
disc_sr, NULL);
+                       }
+                       hashMapIterator_destroy(iter);
+                       celixThreadMutex_unlock(&manager->discoveryListLock);
+               }
+       }
+       hashMapIterator_destroy(pubit);
+
+       celixThreadMutex_unlock(&manager->publicationsLock);
+
+       /* Deactivate all subscriptions */
+       celixThreadMutex_lock(&manager->subscriptionsLock);
+       hash_map_iterator_pt subit = 
hashMapIterator_create(manager->subscriptions);
+       while(hashMapIterator_hasNext(subit)){
+               // TODO do some error checking
+               char* scope_topic = (char*)hashMapIterator_nextKey(subit);
+               char scope[MAX_TOPIC_LEN];
+               char topic[MAX_TOPIC_LEN];
+               memset(scope, 0 , MAX_TOPIC_LEN*sizeof(char));
+               memset(topic, 0 , MAX_TOPIC_LEN*sizeof(char));
+               sscanf(scope_topic, "%[^:]:%s", scope, topic );
+               status += psa->closeAllSubscriptions(psa->admin,scope, topic);
+       }
+       hashMapIterator_destroy(subit);
+       celixThreadMutex_unlock(&manager->subscriptionsLock);
+
+       celixThreadMutex_lock(&manager->psaListLock);
+       arrayList_removeElement(manager->psaList, psa);
+       celixThreadMutex_unlock(&manager->psaListLock);
+
+       logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "PSTM: Removed 
PSA");
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_subscriberAdded(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+       //subscriber_service_pt subscriber = (subscriber_service_pt)service;
+
+       pubsub_endpoint_pt sub = NULL;
+       if(pubsubEndpoint_createFromServiceReference(reference,&sub,false) == 
CELIX_SUCCESS){
+               celixThreadMutex_lock(&manager->subscriptionsLock);
+               char *sub_key = createScopeTopicKey(sub->scope, sub->topic);
+
+               array_list_pt sub_list_by_topic = 
hashMap_get(manager->subscriptions,sub_key);
+               if(sub_list_by_topic==NULL){
+                       arrayList_create(&sub_list_by_topic);
+                       
hashMap_put(manager->subscriptions,strdup(sub_key),sub_list_by_topic);
+               }
+               free(sub_key);
+               arrayList_add(sub_list_by_topic,sub);
+
+               celixThreadMutex_unlock(&manager->subscriptionsLock);
+
+               int j;
+               double score = 0;
+               double best_score = 0;
+               pubsub_admin_service_pt best_psa = NULL;
+               celixThreadMutex_lock(&manager->psaListLock);
+               for(j=0;j<arrayList_size(manager->psaList);j++){
+                       pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,j);
+                       psa->matchEndpoint(psa->admin,sub,&score);
+                       if(score>best_score){ /* We have a new winner! */
+                               best_score = score;
+                               best_psa = psa;
+                       }
+               }
+
+               if(best_psa != NULL && best_score>0){
+                       best_psa->addSubscription(best_psa->admin,sub);
+               }
+
+               // Inform discoveries for interest in the topic
+               celixThreadMutex_lock(&manager->discoveryListLock);
+               hash_map_iterator_pt iter = 
hashMapIterator_create(manager->discoveryList);
+               while(hashMapIterator_hasNext(iter)){
+                       service_reference_pt disc_sr = 
(service_reference_pt)hashMapIterator_nextKey(iter);
+                       publisher_endpoint_announce_pt disc = NULL;
+                       bundleContext_getService(manager->context, disc_sr, 
(void**) &disc);
+                       disc->interestedInTopic(disc->handle, sub->scope, 
sub->topic);
+                       bundleContext_ungetService(manager->context, disc_sr, 
NULL);
+               }
+               hashMapIterator_destroy(iter);
+               celixThreadMutex_unlock(&manager->discoveryListLock);
+
+               celixThreadMutex_unlock(&manager->psaListLock);
+       }
+       else{
+               status=CELIX_INVALID_BUNDLE_CONTEXT;
+       }
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_subscriberModified(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       // Nop...
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_subscriberRemoved(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+
+       pubsub_endpoint_pt subcmp = NULL;
+       if(pubsubEndpoint_createFromServiceReference(reference,&subcmp,false) 
== CELIX_SUCCESS){
+
+               int j,k;
+
+               // Inform discoveries that we not interested in the topic any 
more
+               celixThreadMutex_lock(&manager->discoveryListLock);
+               hash_map_iterator_pt iter = 
hashMapIterator_create(manager->discoveryList);
+               while(hashMapIterator_hasNext(iter)){
+                       service_reference_pt disc_sr = 
(service_reference_pt)hashMapIterator_nextKey(iter);
+                       publisher_endpoint_announce_pt disc = NULL;
+                       bundleContext_getService(manager->context, disc_sr, 
(void**) &disc);
+                       disc->uninterestedInTopic(disc->handle, subcmp->scope, 
subcmp->topic);
+                       bundleContext_ungetService(manager->context, disc_sr, 
NULL);
+               }
+               hashMapIterator_destroy(iter);
+               celixThreadMutex_unlock(&manager->discoveryListLock);
+
+               celixThreadMutex_lock(&manager->subscriptionsLock);
+               celixThreadMutex_lock(&manager->psaListLock);
+
+               char *sub_key = 
createScopeTopicKey(subcmp->scope,subcmp->topic);
+               array_list_pt sub_list_by_topic = 
hashMap_get(manager->subscriptions,sub_key);
+               free(sub_key);
+               if(sub_list_by_topic!=NULL){
+                       for(j=0;j<arrayList_size(sub_list_by_topic);j++){
+                               pubsub_endpoint_pt sub = 
arrayList_get(sub_list_by_topic,j);
+                               if(pubsubEndpoint_equals(sub,subcmp)){
+                                       
for(k=0;k<arrayList_size(manager->psaList);k++){
+                                               /* No problem with invoking 
removal on all psa's, only the one that manage this topic will do something */
+                                               pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,k);
+                                               
psa->removeSubscription(psa->admin,sub);
+                                       }
+
+                               }
+                               arrayList_remove(sub_list_by_topic,j);
+
+                               /* If it was the last subscriber for this 
topic, tell PSA to close the ZMQ socket */
+                               if(arrayList_size(sub_list_by_topic)==0){
+                                       
for(k=0;k<arrayList_size(manager->psaList);k++){
+                                               pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,k);
+                                               
psa->closeAllSubscriptions(psa->admin,sub->scope, sub->topic);
+                                       }
+                               }
+
+                               pubsubEndpoint_destroy(sub);
+
+                       }
+               }
+
+               celixThreadMutex_unlock(&manager->psaListLock);
+               celixThreadMutex_unlock(&manager->subscriptionsLock);
+
+               pubsubEndpoint_destroy(subcmp);
+
+       }
+       else{
+               status=CELIX_INVALID_BUNDLE_CONTEXT;
+       }
+
+       return status;
+
+}
+
+celix_status_t pubsub_topologyManager_pubsubDiscoveryAdded(void* handle, 
service_reference_pt reference, void* service) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = (pubsub_topology_manager_pt)handle;
+       publisher_endpoint_announce_pt disc = 
(publisher_endpoint_announce_pt)service;
+
+       const char* fwUUID = NULL;
+
+       
bundleContext_getProperty(manager->context,OSGI_FRAMEWORK_FRAMEWORK_UUID,&fwUUID);
+       if(fwUUID==NULL){
+               printf("PSD: ERRROR: Cannot retrieve fwUUID.\n");
+               return CELIX_INVALID_BUNDLE_CONTEXT;
+       }
+
+       celixThreadMutex_lock(&manager->publicationsLock);
+
+       celixThreadMutex_lock(&manager->discoveryListLock);
+       hashMap_put(manager->discoveryList, reference, NULL);
+       celixThreadMutex_unlock(&manager->discoveryListLock);
+
+       hash_map_iterator_pt iter = 
hashMapIterator_create(manager->publications);
+       while(hashMapIterator_hasNext(iter)){
+               array_list_pt pubEP_list = 
(array_list_pt)hashMapIterator_nextValue(iter);
+               for(int i = 0; i < arrayList_size(pubEP_list); i++) {
+                       pubsub_endpoint_pt pubEP = 
(pubsub_endpoint_pt)arrayList_get(pubEP_list,i);
+                       if( (strcmp(pubEP->frameworkUUID,fwUUID)==0) && 
(pubEP->endpoint!=NULL)){
+                               status += 
disc->announcePublisher(disc->handle,pubEP);
+                       }
+               }
+       }
+       hashMapIterator_destroy(iter);
+
+       celixThreadMutex_unlock(&manager->publicationsLock);
+
+       celixThreadMutex_lock(&manager->subscriptionsLock);
+       iter = hashMapIterator_create(manager->subscriptions);
+
+       while(hashMapIterator_hasNext(iter)) {
+               array_list_pt l = 
(array_list_pt)hashMapIterator_nextValue(iter);
+               int i;
+               for(i=0;i<arrayList_size(l);i++){
+                       pubsub_endpoint_pt subEp = 
(pubsub_endpoint_pt)arrayList_get(l,i);
+
+                       disc->interestedInTopic(disc->handle, subEp->scope, 
subEp->topic);
+               }
+       }
+       hashMapIterator_destroy(iter);
+       celixThreadMutex_unlock(&manager->subscriptionsLock);
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_pubsubDiscoveryModified(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       status = pubsub_topologyManager_pubsubDiscoveryRemoved(handle, 
reference, service);
+       if (status == CELIX_SUCCESS) {
+               status = pubsub_topologyManager_pubsubDiscoveryAdded(handle, 
reference, service);
+       }
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_pubsubDiscoveryRemoved(void * handle, 
service_reference_pt reference, void * service) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       pubsub_topology_manager_pt manager = handle;
+
+       celixThreadMutex_lock(&manager->discoveryListLock);
+
+
+       if (hashMap_remove(manager->discoveryList, reference)) {
+               logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, 
"EndpointListener Removed");
+       }
+
+       celixThreadMutex_unlock(&manager->discoveryListLock);
+
+       return status;
+}
+
+
+celix_status_t pubsub_topologyManager_publisherTrackerAdded(void *handle, 
array_list_pt listeners) {
+
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+
+       int l_index;
+
+       for (l_index = 0; l_index < arrayList_size(listeners); l_index++) {
+
+               listener_hook_info_pt info = arrayList_get(listeners, l_index);
+
+               pubsub_endpoint_pt pub = NULL;
+               if(pubsubEndpoint_createFromListenerHookInfo(info, &pub, true) 
== CELIX_SUCCESS){
+
+                       celixThreadMutex_lock(&manager->publicationsLock);
+                       char *pub_key = createScopeTopicKey(pub->scope, 
pub->topic);
+                       array_list_pt pub_list_by_topic = 
hashMap_get(manager->publications, pub_key);
+                       if(pub_list_by_topic==NULL){
+                               arrayList_create(&pub_list_by_topic);
+                               
hashMap_put(manager->publications,strdup(pub_key),pub_list_by_topic);
+                       }
+                       free(pub_key);
+                       arrayList_add(pub_list_by_topic,pub);
+
+                       celixThreadMutex_unlock(&manager->publicationsLock);
+
+                       int j;
+                       double score = 0;
+                       double best_score = 0;
+                       pubsub_admin_service_pt best_psa = NULL;
+                       celixThreadMutex_lock(&manager->psaListLock);
+
+                       for(j=0;j<arrayList_size(manager->psaList);j++){
+                               pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,j);
+                               psa->matchEndpoint(psa->admin,pub,&score);
+                               if(score>best_score){ /* We have a new winner! 
*/
+                                       best_score = score;
+                                       best_psa = psa;
+                               }
+                       }
+
+                       if(best_psa != NULL && best_score>0){
+                               status = 
best_psa->addPublication(best_psa->admin,pub);
+                               if(status==CELIX_SUCCESS){
+                                       
celixThreadMutex_lock(&manager->discoveryListLock);
+                                       hash_map_iterator_pt iter = 
hashMapIterator_create(manager->discoveryList);
+                                       while(hashMapIterator_hasNext(iter)){
+                                               service_reference_pt disc_sr = 
(service_reference_pt)hashMapIterator_nextKey(iter);
+                                               publisher_endpoint_announce_pt 
disc = NULL;
+                                               
bundleContext_getService(manager->context, disc_sr, (void**) &disc);
+                                               
disc->announcePublisher(disc->handle,pub);
+                                               
bundleContext_ungetService(manager->context, disc_sr, NULL);
+                                       }
+                                       hashMapIterator_destroy(iter);
+                                       
celixThreadMutex_unlock(&manager->discoveryListLock);
+                               }
+                       }
+
+                       celixThreadMutex_unlock(&manager->psaListLock);
+
+               }
+
+       }
+
+       return status;
+
+}
+
+
+celix_status_t pubsub_topologyManager_publisherTrackerRemoved(void *handle, 
array_list_pt listeners) {
+       celix_status_t status = CELIX_SUCCESS;
+       pubsub_topology_manager_pt manager = handle;
+
+       int l_index;
+
+       for (l_index = 0; l_index < arrayList_size(listeners); l_index++) {
+
+               listener_hook_info_pt info = arrayList_get(listeners, l_index);
+
+               pubsub_endpoint_pt pubcmp = NULL;
+               if(pubsubEndpoint_createFromListenerHookInfo(info,&pubcmp,true) 
== CELIX_SUCCESS){
+
+
+                       int j,k;
+                       celixThreadMutex_lock(&manager->psaListLock);
+                       celixThreadMutex_lock(&manager->publicationsLock);
+
+                       char *pub_key = createScopeTopicKey(pubcmp->scope, 
pubcmp->topic);
+                       array_list_pt pub_list_by_topic = 
hashMap_get(manager->publications,pub_key);
+                       if(pub_list_by_topic!=NULL){
+                               
for(j=0;j<arrayList_size(pub_list_by_topic);j++){
+                                       pubsub_endpoint_pt pub = 
arrayList_get(pub_list_by_topic,j);
+                                       if(pubsubEndpoint_equals(pub,pubcmp)){
+                                               
for(k=0;k<arrayList_size(manager->psaList);k++){
+                                                       pubsub_admin_service_pt 
psa = (pubsub_admin_service_pt)arrayList_get(manager->psaList,k);
+                                                       status = 
psa->removePublication(psa->admin,pub);
+                                                       
if(status==CELIX_SUCCESS){ /* We found the one that manages this endpoint */
+                                                               
celixThreadMutex_lock(&manager->discoveryListLock);
+                                                               
hash_map_iterator_pt iter = hashMapIterator_create(manager->discoveryList);
+                                                               
while(hashMapIterator_hasNext(iter)){
+                                                                       
service_reference_pt disc_sr = 
(service_reference_pt)hashMapIterator_nextKey(iter);
+                                                                       
publisher_endpoint_announce_pt disc = NULL;
+                                                                       
bundleContext_getService(manager->context, disc_sr, (void**) &disc);
+                                                                       
disc->removePublisher(disc->handle,pub);
+                                                                       
bundleContext_ungetService(manager->context, disc_sr, NULL);
+                                                               }
+                                                               
hashMapIterator_destroy(iter);
+                                                               
celixThreadMutex_unlock(&manager->discoveryListLock);
+                                                       }
+                                                       else if(status ==  
CELIX_ILLEGAL_ARGUMENT){ /* Not a real error, just saying this psa does not 
handle this endpoint */
+                                                               status = 
CELIX_SUCCESS;
+                                                       }
+                                               }
+                                               //}
+                                               
arrayList_remove(pub_list_by_topic,j);
+
+                                               /* If it was the last publisher 
for this topic, tell PSA to close the ZMQ socket and then inform the discovery 
*/
+                                               
if(arrayList_size(pub_list_by_topic)==0){
+                                                       
for(k=0;k<arrayList_size(manager->psaList);k++){
+                                                               
pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,k);
+                                                               
psa->closeAllPublications(psa->admin,pub->scope, pub->topic);
+                                                       }
+                                               }
+
+                                               pubsubEndpoint_destroy(pub);
+                                       }
+
+                               }
+                       }
+
+                       celixThreadMutex_unlock(&manager->publicationsLock);
+                       celixThreadMutex_unlock(&manager->psaListLock);
+
+                       free(pub_key);
+
+                       pubsubEndpoint_destroy(pubcmp);
+
+               }
+
+       }
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_announcePublisher(void *handle, 
pubsub_endpoint_pt pubEP){
+       celix_status_t status = CELIX_SUCCESS;
+       printf("PSTM: New publisher discovered for topic %s [fwUUID=%s, 
ep=%s]\n",pubEP->topic,pubEP->frameworkUUID,pubEP->endpoint);
+
+       pubsub_topology_manager_pt manager = handle;
+       celixThreadMutex_lock(&manager->psaListLock);
+       celixThreadMutex_lock(&manager->publicationsLock);
+
+       char *pub_key = createScopeTopicKey(pubEP->scope, pubEP->topic);
+
+       array_list_pt pub_list_by_topic = 
hashMap_get(manager->publications,pub_key);
+       if(pub_list_by_topic==NULL){
+               arrayList_create(&pub_list_by_topic);
+               
hashMap_put(manager->publications,strdup(pub_key),pub_list_by_topic);
+       }
+       free(pub_key);
+
+       /* Shouldn't be any other duplicate, since it's filtered out by the 
discovery */
+       pubsub_endpoint_pt p = NULL;
+       pubsubEndpoint_clone(pubEP, &p);
+       arrayList_add(pub_list_by_topic,p);
+
+       int j;
+       double score = 0;
+       double best_score = 0;
+       pubsub_admin_service_pt best_psa = NULL;
+
+       for(j=0;j<arrayList_size(manager->psaList);j++){
+               pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,j);
+               psa->matchEndpoint(psa->admin,p,&score);
+               if(score>best_score){ /* We have a new winner! */
+                       best_score = score;
+                       best_psa = psa;
+               }
+       }
+
+       if(best_psa != NULL && best_score>0){
+               best_psa->addPublication(best_psa->admin,p);
+       }
+       else{
+               status = CELIX_ILLEGAL_STATE;
+       }
+
+       celixThreadMutex_unlock(&manager->publicationsLock);
+       celixThreadMutex_unlock(&manager->psaListLock);
+
+       return status;
+}
+
+celix_status_t pubsub_topologyManager_removePublisher(void *handle, 
pubsub_endpoint_pt pubEP){
+       celix_status_t status = CELIX_SUCCESS;
+       printf("PSTM: Publisher removed for topic %s [fwUUID=%s, 
ep=%s]\n",pubEP->topic,pubEP->frameworkUUID,pubEP->endpoint);
+
+       pubsub_topology_manager_pt manager = handle;
+       celixThreadMutex_lock(&manager->psaListLock);
+       celixThreadMutex_lock(&manager->publicationsLock);
+       int i;
+
+       char *pub_key = createScopeTopicKey(pubEP->scope, pubEP->topic);
+       array_list_pt pub_list_by_topic = 
hashMap_get(manager->publications,pub_key);
+       if(pub_list_by_topic==NULL){
+               printf("PSTM: ERROR: Cannot find topic for known endpoint 
[%s,%s,%s]. Something is 
inconsistent.\n",pub_key,pubEP->frameworkUUID,pubEP->endpoint);
+               status = CELIX_ILLEGAL_STATE;
+       }
+       else{
+
+               pubsub_endpoint_pt p = NULL;
+               bool found = false;
+
+               for(i=0;!found && i<arrayList_size(pub_list_by_topic);i++){
+                       p = 
(pubsub_endpoint_pt)arrayList_get(pub_list_by_topic,i);
+                       found = pubsubEndpoint_equals(p,pubEP);
+               }
+
+               if(found && p !=NULL){
+
+                       for(i=0;i<arrayList_size(manager->psaList);i++){
+                               pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,i);
+                               /* No problem with invoking removal on all 
psa's, only the one that manage this topic will do something */
+                               psa->removePublication(psa->admin,p);
+                       }
+
+                       arrayList_removeElement(pub_list_by_topic,p);
+
+                       /* If it was the last publisher for this topic, tell 
PSA to close the ZMQ socket */
+                       if(arrayList_size(pub_list_by_topic)==0){
+
+                               for(i=0;i<arrayList_size(manager->psaList);i++){
+                                       pubsub_admin_service_pt psa = 
(pubsub_admin_service_pt)arrayList_get(manager->psaList,i);
+                                       
psa->closeAllPublications(psa->admin,p->scope, p->topic);
+                               }
+                       }
+
+                       pubsubEndpoint_destroy(p);
+               }
+
+
+       }
+       free(pub_key);
+       celixThreadMutex_unlock(&manager->publicationsLock);
+       celixThreadMutex_unlock(&manager->psaListLock);
+
+
+       return status;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.h
----------------------------------------------------------------------
diff --git a/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.h 
b/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.h
new file mode 100644
index 0000000..0074a75
--- /dev/null
+++ b/pubsub/pubsub_topology_manager/src/pubsub_topology_manager.h
@@ -0,0 +1,82 @@
+/**
+ *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.
+ */
+/*
+ * pubsub_topology_manager.h
+ *
+ *  \date       Sep 29, 2011
+ *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
+ *  \copyright Apache License, Version 2.0
+ */
+
+#ifndef PUBSUB_TOPOLOGY_MANAGER_H_
+#define PUBSUB_TOPOLOGY_MANAGER_H_
+
+#include "service_reference.h"
+#include "bundle_context.h"
+#include "log_helper.h"
+
+#include "pubsub_common.h"
+#include "pubsub_endpoint.h"
+#include "pubsub/publisher.h"
+#include "pubsub/subscriber.h"
+
+
+struct pubsub_topology_manager {
+       bundle_context_pt context;
+
+       celix_thread_mutex_t psaListLock;
+       array_list_pt psaList;
+
+       celix_thread_mutex_t discoveryListLock;
+       hash_map_pt discoveryList; //<serviceReference,NULL>
+
+       celix_thread_mutex_t publicationsLock;
+       hash_map_pt publications; //<topic(string),list<pubsub_ep>>
+
+       celix_thread_mutex_t subscriptionsLock;
+       hash_map_pt subscriptions; //<topic(string),list<pubsub_ep>>
+
+       log_helper_pt loghelper;
+};
+
+typedef struct pubsub_topology_manager *pubsub_topology_manager_pt;
+
+celix_status_t pubsub_topologyManager_create(bundle_context_pt context, 
log_helper_pt logHelper, pubsub_topology_manager_pt *manager);
+celix_status_t pubsub_topologyManager_destroy(pubsub_topology_manager_pt 
manager);
+celix_status_t pubsub_topologyManager_closeImports(pubsub_topology_manager_pt 
manager);
+
+celix_status_t pubsub_topologyManager_psaAdded(void *handle, 
service_reference_pt reference, void *service);
+celix_status_t pubsub_topologyManager_psaModified(void *handle, 
service_reference_pt reference, void *service);
+celix_status_t pubsub_topologyManager_psaRemoved(void *handle, 
service_reference_pt reference, void *service);
+
+celix_status_t pubsub_topologyManager_pubsubDiscoveryAdded(void* handle, 
service_reference_pt reference, void* service);
+celix_status_t pubsub_topologyManager_pubsubDiscoveryModified(void * handle, 
service_reference_pt reference, void* service);
+celix_status_t pubsub_topologyManager_pubsubDiscoveryRemoved(void * handle, 
service_reference_pt reference, void* service);
+
+celix_status_t pubsub_topologyManager_subscriberAdded(void * handle, 
service_reference_pt reference, void * service);
+celix_status_t pubsub_topologyManager_subscriberModified(void * handle, 
service_reference_pt reference, void * service);
+celix_status_t pubsub_topologyManager_subscriberRemoved(void * handle, 
service_reference_pt reference, void * service);
+
+celix_status_t pubsub_topologyManager_publisherTrackerAdded(void *handle, 
array_list_pt listeners);
+celix_status_t pubsub_topologyManager_publisherTrackerRemoved(void *handle, 
array_list_pt listeners);
+
+celix_status_t pubsub_topologyManager_announcePublisher(void *handle, 
pubsub_endpoint_pt pubEP);
+celix_status_t pubsub_topologyManager_removePublisher(void *handle, 
pubsub_endpoint_pt pubEP);
+
+#endif /* PUBSUB_TOPOLOGY_MANAGER_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/pubsub/test/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/pubsub/test/CMakeLists.txt b/pubsub/test/CMakeLists.txt
index 65e22e5..9fd324e 100644
--- a/pubsub/test/CMakeLists.txt
+++ b/pubsub/test/CMakeLists.txt
@@ -20,23 +20,21 @@ find_program(ETCD_CMD NAMES etcd)
 find_package(CppUTest REQUIRED)
 include_directories(${CPPUTEST_INCLUDE_DIR})
 
-include_directories(
-        ${CMAKE_SOURCE_DIR}/pubsub/api
-        test
-)
-
 add_bundle(pubsub_sut
     #"Vanilla" bundle which is under test
     SOURCES
         test/sut_activator.c
     VERSION 1.0.0
 )
-target_link_libraries(pubsub_sut PRIVATE Celix::framework)
+target_include_directories(pubsub_sut PRIVATE test)
+target_link_libraries(pubsub_sut PRIVATE Celix::pubsub_spi)
+
 bundle_files(pubsub_sut
     msg_descriptors/msg.descriptor
     msg_descriptors/sync.descriptor
     DESTINATION "META-INF/descriptors/messages"
 )
+
 add_deploy(pubsub_udpmc_sut
     NAME deploy_sut
     BUNDLES

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/CMakeLists.txt b/remote_services/CMakeLists.txt
index bb45908..ae27849 100644
--- a/remote_services/CMakeLists.txt
+++ b/remote_services/CMakeLists.txt
@@ -18,23 +18,24 @@
 celix_subproject(REMOTE_SERVICE_ADMIN "Option to enable building the Remote 
Service Admin Service bundles" OFF)
 if (REMOTE_SERVICE_ADMIN)
 
-    add_subdirectory(examples)
+    add_subdirectory(remote_services_api)
+    add_subdirectory(rsa_spi)
+    add_subdirectory(rsa_common)
+
+    add_subdirectory(civetweb)
 
     add_subdirectory(topology_manager)
 
-    add_subdirectory(civetweb)
     add_subdirectory(discovery_common)
     add_subdirectory(discovery_configured)
     add_subdirectory(discovery_etcd)
     add_subdirectory(discovery_shm)
 
     #TODO refactor shm rsa to use dfi
-    add_subdirectory(remote_service_admin_api)
-    add_subdirectory(remote_service_admin_common)
     #add_subdirectory(remote_service_admin_shm)
     add_subdirectory(remote_service_admin_dfi)
 
-
+    add_subdirectory(examples)
 endif (REMOTE_SERVICE_ADMIN)
 
 

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/discovery_common/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/discovery_common/CMakeLists.txt 
b/remote_services/discovery_common/CMakeLists.txt
index c3242a6..114f485 100644
--- a/remote_services/discovery_common/CMakeLists.txt
+++ b/remote_services/discovery_common/CMakeLists.txt
@@ -31,7 +31,7 @@ target_include_directories(rsa_discovery_common PUBLIC
                
$<TARGET_PROPERTY:Celix::framework,INTERFACE_INCLUDE_DIRECTORIES>
                $<TARGET_PROPERTY:Celix::utils,INTERFACE_INCLUDE_DIRECTORIES>
                
$<TARGET_PROPERTY:Celix::log_helper,INTERFACE_INCLUDE_DIRECTORIES>
-               $<TARGET_PROPERTY:Celix::rsa_api,INTERFACE_INCLUDE_DIRECTORIES>
+               $<TARGET_PROPERTY:Celix::rsa_spi,INTERFACE_INCLUDE_DIRECTORIES>
                $<TARGET_PROPERTY:civetweb,INCLUDE_DIRECTORIES>
                ${LIBXML2_INCLUDE_DIR})
 

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/examples/calculator_service/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/examples/calculator_service/CMakeLists.txt 
b/remote_services/examples/calculator_service/CMakeLists.txt
index 5d97d16..167e705 100644
--- a/remote_services/examples/calculator_service/CMakeLists.txt
+++ b/remote_services/examples/calculator_service/CMakeLists.txt
@@ -23,7 +23,7 @@ add_bundle(calculator
     VERSION 0.0.1
 )
 target_include_directories(calculator PRIVATE src)
-target_link_libraries(calculator PRIVATE Celix::rsa_api calculator_api)
+target_link_libraries(calculator PRIVATE Celix::rsa_spi calculator_api)
 
 get_target_property(DESCR calculator_api INTERFACE_CALCULATOR_DESCRIPTOR)
 bundle_files(calculator ${DESCR} DESTINATION .)

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_api/CMakeLists.txt 
b/remote_services/remote_service_admin_api/CMakeLists.txt
deleted file mode 100644
index f665576..0000000
--- a/remote_services/remote_service_admin_api/CMakeLists.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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.
-
-add_library(rsa_api INTERFACE)
-target_include_directories(rsa_api INTERFACE include)
-
-install (FILES 
-        include/remote_endpoint_impl.h
-        include/remote_endpoint.h
-        include/remote_proxy.h
-        include/remote_service_admin.h
-        include/export_registration.h
-        include/import_registration.h
-        include/endpoint_description.h
-        include/endpoint_listener.h
-        include/remote_constants.h
-    DESTINATION 
-        include/celix/remote_service_admin 
-    COMPONENT 
-        remote_service_admin
-)
-install (FILES 
-        public/include/endpoint_listener.h
-    DESTINATION 
-        include/celix/endpoint_listener 
-    COMPONENT 
-        remote_service_admin
-)
-
-#Setup target aliases to match external usage
-add_library(Celix::rsa_api ALIAS rsa_api)

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/README.md
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_api/README.md 
b/remote_services/remote_service_admin_api/README.md
deleted file mode 100644
index 2e3d268..0000000
--- a/remote_services/remote_service_admin_api/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Remote Service Admin
-
-The Remote Service Admin (RSA) provides the mechanisms to import and export 
services when instructed to do so by the Topology Manager. 
-
-To delegate method calls to the actual service implementation, the RSA_SHM and 
the RSA_HTTP are using "endpoint/proxy" bundles, which has all the knowledge 
about the marshalling and unmarshalling of data for the service. The RSA_DFI 
implementation combines a [foreign function 
interface](https://en.wikipedia.org/wiki/Foreign_function_interface) technique 
together with manualy created descriptors.  
-
-Note that this folder contains code commonly used by the RSA implementations 
and therefore does not include any CMAKE configuration.
-
-## Properties
-    ENDPOINTS                           defines the relative directory where 
endpoints and proxys can be found (default: endpoints)
-    CELIX_FRAMEWORK_EXTENDER_PATH  Used in RSA_DFI only. Can be used to define 
a path to use as an extender path point for the framework bundle. For normal 
bundles the bundle cache is used. 

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/endpoint_description.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/endpoint_description.h 
b/remote_services/remote_service_admin_api/include/endpoint_description.h
deleted file mode 100644
index de27d2e..0000000
--- a/remote_services/remote_service_admin_api/include/endpoint_description.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- *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.
- */
-/*
- * endpoint_description.h
- *
- *  \date       25 Jul 2014
- *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
- *  \copyright  Apache License, Version 2.0
- */
-
-#ifndef ENDPOINT_DESCRIPTION_H_
-#define ENDPOINT_DESCRIPTION_H_
-
-#include "properties.h"
-#include "array_list.h"
-
-struct endpoint_description {
-    char *frameworkUUID;
-    char *id;
-    // array_list_pt intents;
-    char *service;
-    // HASH_MAP packageVersions;
-    properties_pt properties;
-    unsigned long serviceId;
-};
-
-typedef struct endpoint_description endpoint_description_t;
-typedef endpoint_description_t* endpoint_description_pt;
-
-celix_status_t endpointDescription_create(properties_pt properties, 
endpoint_description_pt *endpointDescription);
-celix_status_t endpointDescription_destroy(endpoint_description_pt 
description);
-
-
-#endif /* ENDPOINT_DESCRIPTION_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/endpoint_listener.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/endpoint_listener.h 
b/remote_services/remote_service_admin_api/include/endpoint_listener.h
deleted file mode 100644
index 2e6359f..0000000
--- a/remote_services/remote_service_admin_api/include/endpoint_listener.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- *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.
- */
-/*
- * endpoint_listener.h
- *
- *  \date       Sep 29, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef ENDPOINT_LISTENER_H_
-#define ENDPOINT_LISTENER_H_
-
-#include "array_list.h"
-#include "properties.h"
-
-#include "endpoint_description.h"
-
-static const char * const OSGI_ENDPOINT_LISTENER_SERVICE = "endpoint_listener";
-
-static const char * const OSGI_ENDPOINT_LISTENER_SCOPE = 
"endpoint.listener.scope";
-
-struct endpoint_listener {
-       void *handle;
-       celix_status_t (*endpointAdded)(void *handle, endpoint_description_pt 
endpoint, char *machtedFilter);
-       celix_status_t (*endpointRemoved)(void *handle, endpoint_description_pt 
endpoint, char *machtedFilter);
-};
-
-typedef struct endpoint_listener endpoint_listener_t;
-typedef endpoint_listener_t *endpoint_listener_pt;
-
-
-#endif /* ENDPOINT_LISTENER_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/export_registration.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/export_registration.h 
b/remote_services/remote_service_admin_api/include/export_registration.h
deleted file mode 100644
index dc3882b..0000000
--- a/remote_services/remote_service_admin_api/include/export_registration.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed under Apache License v2. See LICENSE for more information.
- */
-#ifndef CELIX_EXPORT_REGISTRATION_H
-#define CELIX_EXPORT_REGISTRATION_H
-
-#include "celix_errno.h"
-#include "endpoint_description.h"
-#include "service_reference.h"
-
-typedef struct export_registration *export_registration_pt;
-
-typedef struct export_reference *export_reference_pt;
-
-celix_status_t exportRegistration_close(export_registration_pt registration);
-celix_status_t exportRegistration_getException(export_registration_pt 
registration);
-celix_status_t exportRegistration_getExportReference(export_registration_pt 
registration, export_reference_pt *reference);
-
-celix_status_t exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint);
-celix_status_t exportReference_getExportedService(export_reference_pt 
reference, service_reference_pt *service);
-
-#endif //CELIX_EXPORT_REGISTRATION_H

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/import_registration.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/import_registration.h 
b/remote_services/remote_service_admin_api/include/import_registration.h
deleted file mode 100644
index ef8193f..0000000
--- a/remote_services/remote_service_admin_api/include/import_registration.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed under Apache License v2. See LICENSE for more information.
- */
-#ifndef CELIX_IMPORT_REGISTRATION_H
-#define CELIX_IMPORT_REGISTRATION_H
-
-#include "celix_errno.h"
-#include "endpoint_description.h"
-#include "service_reference.h"
-
-typedef struct import_registration *import_registration_pt;
-
-typedef struct import_reference *import_reference_pt;
-
-celix_status_t importRegistration_close(import_registration_pt registration);
-celix_status_t importRegistration_getException(import_registration_pt 
registration);
-celix_status_t importRegistration_getImportReference(import_registration_pt 
registration, import_reference_pt *reference);
-
-celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference);
-celix_status_t importReference_getImportedService(import_reference_pt 
reference);
-
-#endif //CELIX_IMPORT_REGISTRATION_H

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/remote_constants.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/remote_constants.h 
b/remote_services/remote_service_admin_api/include/remote_constants.h
deleted file mode 100644
index 0736685..0000000
--- a/remote_services/remote_service_admin_api/include/remote_constants.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_constants.h
- *
- *  \date       Sep 30, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_CONSTANTS_H_
-#define REMOTE_CONSTANTS_H_
-
-static const char * const OSGI_RSA_SERVICE_EXPORTED_INTERFACES = 
"service.exported.interfaces";
-static const char * const OSGI_RSA_ENDPOINT_FRAMEWORK_UUID = 
"endpoint.framework.uuid";
-static const char * const OSGI_RSA_ENDPOINT_SERVICE_ID = "endpoint.service.id";
-static const char * const OSGI_RSA_ENDPOINT_ID = "endpoint.id";
-static const char * const OSGI_RSA_SERVICE_IMPORTED = "service.imported";
-static const char * const OSGI_RSA_SERVICE_IMPORTED_CONFIGS = 
"service.imported.configs";
-static const char * const OSGI_RSA_SERVICE_LOCATION = "service.location";
-
-#endif /* REMOTE_CONSTANTS_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/remote_endpoint.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_api/include/remote_endpoint.h 
b/remote_services/remote_service_admin_api/include/remote_endpoint.h
deleted file mode 100644
index ab80abb..0000000
--- a/remote_services/remote_service_admin_api/include/remote_endpoint.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_endpoint.h
- *
- *  \date       Oct 7, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_ENDPOINT_H_
-#define REMOTE_ENDPOINT_H_
-
-#define OSGI_RSA_REMOTE_ENDPOINT "remote_endpoint"
-
-typedef struct remote_endpoint remote_endpoint_t;
-typedef remote_endpoint_t* remote_endpoint_pt;
-
-struct remote_endpoint_service {
-       remote_endpoint_pt endpoint;
-       celix_status_t (*setService)(remote_endpoint_pt endpoint, void 
*service);
-       celix_status_t (*handleRequest)(remote_endpoint_pt endpoint, char 
*data, char **reply);
-};
-
-typedef struct remote_endpoint_service *remote_endpoint_service_pt;
-
-
-#endif /* REMOTE_ENDPOINT_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/remote_endpoint_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/remote_endpoint_impl.h 
b/remote_services/remote_service_admin_api/include/remote_endpoint_impl.h
deleted file mode 100644
index 3782d62..0000000
--- a/remote_services/remote_service_admin_api/include/remote_endpoint_impl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_endpoint_impl.h
- *
- *  \date       Oct 11, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_ENDPOINT_IMPL_H_
-#define REMOTE_ENDPOINT_IMPL_H_
-
-#include "remote_endpoint.h"
-#include "celix_threads.h"
-
-struct remote_endpoint {
-       celix_thread_mutex_t serviceLock;
-       void *service;
-};
-
-#endif /* REMOTE_ENDPOINT_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/remote_proxy.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_api/include/remote_proxy.h 
b/remote_services/remote_service_admin_api/include/remote_proxy.h
deleted file mode 100644
index 4c3f5c3..0000000
--- a/remote_services/remote_service_admin_api/include/remote_proxy.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_proxy.h
- *
- *  \date       Oct 13, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_PROXY_H_
-#define REMOTE_PROXY_H_
-
-#include "endpoint_listener.h"
-#include "remote_service_admin.h"
-
-#define OSGI_RSA_REMOTE_PROXY_FACTORY  "remote_proxy_factory"
-#define OSGI_RSA_REMOTE_PROXY_TIMEOUT   "remote_proxy_timeout"
-
-typedef celix_status_t (*sendToHandle)(remote_service_admin_pt 
remote_service_admin_ptr, endpoint_description_pt endpointDescription, char 
*request, char **reply, int* replyStatus);
-typedef celix_status_t (*createProxyService)(void *handle, 
endpoint_description_pt endpointDescription, remote_service_admin_pt rsa, 
sendToHandle sendToCallback, properties_pt properties, void **service);
-typedef celix_status_t (*destroyProxyService)(void *handle, void *service);
-
-typedef struct remote_proxy_factory *remote_proxy_factory_pt;
-typedef struct remote_proxy_factory_service *remote_proxy_factory_service_pt;
-
-struct remote_proxy_factory {
-       bundle_context_pt context_ptr;
-       char *service;
-
-       remote_proxy_factory_service_pt remote_proxy_factory_service_ptr;
-       properties_pt properties;
-       service_registration_pt registration;
-
-       hash_map_pt proxy_instances;
-
-       void *handle;
-
-       createProxyService create_proxy_service_ptr;
-       destroyProxyService destroy_proxy_service_ptr;
-};
-
-struct remote_proxy_factory_service {
-       remote_proxy_factory_pt factory;
-       celix_status_t (*registerProxyService)(remote_proxy_factory_pt 
proxyFactoryService, endpoint_description_pt endpoint, remote_service_admin_pt 
remote_service_admin_ptr, sendToHandle callback);
-       celix_status_t (*unregisterProxyService)(remote_proxy_factory_pt 
proxyFactoryService, endpoint_description_pt endpoint);
-};
-
-celix_status_t remoteProxyFactory_create(bundle_context_pt context, char 
*service, void *handle,
-               createProxyService create, destroyProxyService destroy,
-               remote_proxy_factory_pt *remote_proxy_factory_ptr);
-celix_status_t remoteProxyFactory_destroy(remote_proxy_factory_pt 
*remote_proxy_factory_ptr);
-
-celix_status_t remoteProxyFactory_register(remote_proxy_factory_pt 
remote_proxy_factory_ptr);
-celix_status_t remoteProxyFactory_unregister(remote_proxy_factory_pt 
remote_proxy_factory_ptr);
-
-
-
-
-#endif /* REMOTE_PROXY_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_api/include/remote_service_admin.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_api/include/remote_service_admin.h 
b/remote_services/remote_service_admin_api/include/remote_service_admin.h
deleted file mode 100644
index cc7fd98..0000000
--- a/remote_services/remote_service_admin_api/include/remote_service_admin.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_service_admin.h
- *
- *  \date       Sep 30, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef REMOTE_SERVICE_ADMIN_H_
-#define REMOTE_SERVICE_ADMIN_H_
-
-#include "endpoint_listener.h"
-#include "service_reference.h"
-#include "export_registration.h"
-#include "import_registration.h"
-
-#define OSGI_RSA_REMOTE_SERVICE_ADMIN "remote_service_admin"
-
-typedef struct import_registration_factory import_registration_factory_t;
-typedef import_registration_factory_t* import_registration_factory_pt;
-
-typedef struct remote_service_admin remote_service_admin_t;
-typedef remote_service_admin_t* remote_service_admin_pt;
-
-struct remote_service_admin_service {
-       remote_service_admin_pt admin;
-       celix_status_t (*exportService)(remote_service_admin_pt admin, char 
*serviceId, properties_pt properties, array_list_pt *registrations);
-       celix_status_t (*removeExportedService)(remote_service_admin_pt admin, 
export_registration_pt registration);
-       celix_status_t (*getExportedServices)(remote_service_admin_pt admin, 
array_list_pt *services);
-       celix_status_t (*getImportedEndpoints)(remote_service_admin_pt admin, 
array_list_pt *services);
-       celix_status_t (*importService)(remote_service_admin_pt admin, 
endpoint_description_pt endpoint, import_registration_pt *registration);
-
-       celix_status_t 
(*exportReference_getExportedEndpoint)(export_reference_pt reference, 
endpoint_description_pt *endpoint);
-       celix_status_t 
(*exportReference_getExportedService)(export_reference_pt reference, 
service_reference_pt *service);
-
-       celix_status_t (*exportRegistration_close)(remote_service_admin_pt 
admin, export_registration_pt registration);
-       celix_status_t 
(*exportRegistration_getException)(export_registration_pt registration);
-       celix_status_t 
(*exportRegistration_getExportReference)(export_registration_pt registration, 
export_reference_pt *reference);
-       celix_status_t 
(*exportRegistration_freeExportReference)(export_reference_pt *reference);
-       celix_status_t 
(*exportRegistration_getEndpointDescription)(export_registration_pt 
registration, endpoint_description_pt endpointDescription);
-
-       celix_status_t 
(*importReference_getImportedEndpoint)(import_reference_pt reference);
-       celix_status_t 
(*importReference_getImportedService)(import_reference_pt reference);
-
-       celix_status_t (*importRegistration_close)(remote_service_admin_pt 
admin, import_registration_pt registration);
-       celix_status_t 
(*importRegistration_getException)(import_registration_pt registration);
-       celix_status_t 
(*importRegistration_getImportReference)(import_registration_pt registration, 
import_reference_pt *reference);
-
-};
-
-typedef struct remote_service_admin_service remote_service_admin_service_t;
-typedef remote_service_admin_service_t* remote_service_admin_service_pt;
-
-
-#endif /* REMOTE_SERVICE_ADMIN_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_common/CMakeLists.txt 
b/remote_services/remote_service_admin_common/CMakeLists.txt
deleted file mode 100644
index 018d868..0000000
--- a/remote_services/remote_service_admin_common/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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.
-
-add_library(rsa_common STATIC
-    src/endpoint_description.c
-    src/export_registration_impl.c
-    src/import_registration_impl.c
-)
-target_include_directories(rsa_common PRIVATE src)
-target_link_libraries(rsa_common PUBLIC Celix::framework Celix::rsa_api 
Celix::log_helper)
-
-#Setup target aliases to match external usage
-add_library(Celix::rsa_common ALIAS rsa_common)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/endpoint_description.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/endpoint_description.c 
b/remote_services/remote_service_admin_common/src/endpoint_description.c
deleted file mode 100644
index 0d8b684..0000000
--- a/remote_services/remote_service_admin_common/src/endpoint_description.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- *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.
- */
-/*
- * endpoint_description.c
- *
- *  \date       25 Jul 2014
- *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
- *  \copyright  Apache License, Version 2.0
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "celix_errno.h"
-#include "celix_log.h"
-
-#include "endpoint_description.h"
-#include "remote_constants.h"
-#include "constants.h"
-
-static celix_status_t endpointDescription_verifyLongProperty(properties_pt 
properties, char *propertyName, unsigned long *longProperty);
-
-celix_status_t endpointDescription_create(properties_pt properties, 
endpoint_description_pt *endpointDescription) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       unsigned long serviceId = 0UL;
-       status = endpointDescription_verifyLongProperty(properties, (char *) 
OSGI_RSA_ENDPOINT_SERVICE_ID, &serviceId);
-       if (status != CELIX_SUCCESS) {
-               return status;
-       }
-
-       endpoint_description_pt ep = calloc(1,sizeof(*ep));
-
-    ep->properties = properties;
-    ep->frameworkUUID = (char*)properties_get(properties, 
OSGI_RSA_ENDPOINT_FRAMEWORK_UUID);
-    ep->id = (char*)properties_get(properties, OSGI_RSA_ENDPOINT_ID);
-    ep->service = strndup(properties_get(properties, 
OSGI_FRAMEWORK_OBJECTCLASS), 1024*10);
-    ep->serviceId = serviceId;
-
-    if (!(ep->frameworkUUID) || !(ep->id) || !(ep->service) ) {
-       fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR, "ENDPOINT_DESCRIPTION: 
incomplete description!.");
-       status = CELIX_BUNDLE_EXCEPTION;
-    }
-
-    if(status == CELIX_SUCCESS){
-       *endpointDescription = ep;
-    }
-    else{
-       *endpointDescription = NULL;
-       free(ep);
-    }
-
-    return status;
-}
-
-celix_status_t endpointDescription_destroy(endpoint_description_pt 
description) {
-    properties_destroy(description->properties);
-    free(description->service);
-    free(description);
-    return CELIX_SUCCESS;
-}
-
-static celix_status_t endpointDescription_verifyLongProperty(properties_pt 
properties, char *propertyName, unsigned long *longProperty) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    const char *value = properties_get(properties, propertyName);
-    if (value == NULL) {
-        *longProperty = 0UL;
-    } else {
-        *longProperty = strtoul(value,NULL,10);
-    }
-
-    return status;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/export_registration_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/export_registration_impl.c 
b/remote_services/remote_service_admin_common/src/export_registration_impl.c
deleted file mode 100644
index 1c684e7..0000000
--- a/remote_services/remote_service_admin_common/src/export_registration_impl.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
- *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.
- */
-/*
- * export_registration_impl.c
- *
- *  \date       Oct 6, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-#include <stdlib.h>
-
-#include "constants.h"
-
-#include "celix_errno.h"
-
-#include "export_registration_impl.h"
-#include "remote_service_admin_impl.h"
-
-
-struct export_reference {
-       endpoint_description_pt endpoint;
-       service_reference_pt reference;
-};
-
-celix_status_t exportRegistration_endpointAdding(void * handle, 
service_reference_pt reference, void **service);
-celix_status_t exportRegistration_endpointAdded(void * handle, 
service_reference_pt reference, void *service);
-celix_status_t exportRegistration_endpointModified(void * handle, 
service_reference_pt reference, void *service);
-celix_status_t exportRegistration_endpointRemoved(void * handle, 
service_reference_pt reference, void *service);
-
-celix_status_t exportRegistration_createEndpointTracker(export_registration_pt 
registration, service_tracker_pt *tracker);
-
-celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt 
*registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       *registration = calloc(1, sizeof(**registration));
-       if (!*registration) {
-               status = CELIX_ENOMEM;
-       } else {
-               (*registration)->context = context;
-               (*registration)->closed = false;
-               (*registration)->endpointDescription = endpoint;
-               (*registration)->reference = reference;
-               (*registration)->rsa = rsa;
-               (*registration)->tracker = NULL;
-               (*registration)->endpoint = NULL;
-               (*registration)->endpointTracker = NULL;
-               (*registration)->exportReference = NULL;
-               (*registration)->bundle = NULL;
-               (*registration)->loghelper = helper;
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_destroy(export_registration_pt 
*registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       
remoteServiceAdmin_destroyEndpointDescription(&(*registration)->endpointDescription);
-       free(*registration);
-
-       return status;
-}
-
-celix_status_t exportRegistration_startTracking(export_registration_pt 
registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (registration->endpointTracker == NULL) {
-               status = exportRegistration_createEndpointTracker(registration, 
&registration->endpointTracker);
-               if (status == CELIX_SUCCESS) {
-                       status = 
serviceTracker_open(registration->endpointTracker);
-               }
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_stopTracking(export_registration_pt 
registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       if (registration->endpointTracker != NULL) {
-               status = serviceTracker_close(registration->endpointTracker);
-               if (status != CELIX_SUCCESS) {
-                   logHelper_log(registration->loghelper, 
OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close endpoint tracker");
-               }
-               else {
-                       status = 
serviceTracker_destroy(registration->endpointTracker);
-               }
-       }
-       if (registration->tracker != NULL) {
-               status = serviceTracker_close(registration->tracker);
-               if (status != CELIX_SUCCESS) {
-                       logHelper_log(registration->loghelper, 
OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close service tracker");
-               }
-               else {
-                       status = serviceTracker_destroy(registration->tracker);
-               }
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_createEndpointTracker(export_registration_pt 
registration, service_tracker_pt *tracker) {
-       celix_status_t status;
-
-       service_tracker_customizer_pt customizer = NULL;
-
-       status = serviceTrackerCustomizer_create(registration, 
exportRegistration_endpointAdding,
-                       exportRegistration_endpointAdded, 
exportRegistration_endpointModified, exportRegistration_endpointRemoved, 
&customizer);
-
-       if (status == CELIX_SUCCESS) {
-               char filter[512];
-
-               snprintf(filter, 512, "(&(%s=%s)(remote.interface=%s))", 
(char*) OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_ENDPOINT, 
registration->endpointDescription->service);
-               status = serviceTracker_createWithFilter(registration->context, 
filter, customizer, tracker);
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_endpointAdding(void * handle, 
service_reference_pt reference, void **service) {
-       celix_status_t status;
-       export_registration_pt registration = handle;
-
-       status = bundleContext_getService(registration->context, reference, 
service);
-
-       return status;
-}
-
-celix_status_t exportRegistration_endpointAdded(void * handle, 
service_reference_pt reference, void *endpoint_service) {
-       celix_status_t status = CELIX_SUCCESS;
-       export_registration_pt registration = handle;
-
-       remote_endpoint_service_pt endpoint = endpoint_service;
-       if (registration->endpoint == NULL) {
-               registration->endpoint = endpoint;
-               void *service = NULL;
-               status = bundleContext_getService(registration->context, 
registration->reference, &service);
-               if (status == CELIX_SUCCESS) {
-                       endpoint->setService(endpoint->endpoint, service);
-               }
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_endpointModified(void * handle, 
service_reference_pt reference, void *service) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       return status;
-}
-
-celix_status_t exportRegistration_endpointRemoved(void * handle, 
service_reference_pt reference, void *service) {
-       celix_status_t status = CELIX_SUCCESS;
-       export_registration_pt registration = handle;
-
-       remote_endpoint_service_pt endpoint = service;
-       if (registration->endpoint != NULL) {
-               endpoint->setService(endpoint->endpoint, NULL);
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_open(export_registration_pt registration) {
-       celix_status_t status = CELIX_SUCCESS;
-       const char *bundleStore = NULL;
-
-       bundleContext_getProperty(registration->context, 
BUNDLE_STORE_PROPERTY_NAME, &bundleStore);
-
-       if (bundleStore == NULL) {
-               bundleStore = DEFAULT_BUNDLE_STORE;
-       }
-       char name[256];
-
-       snprintf(name, 256, "%s/%s_endpoint.zip", bundleStore, 
registration->endpointDescription->service);
-
-       status = bundleContext_installBundle(registration->context, name, 
&registration->bundle);
-       if (status == CELIX_SUCCESS) {
-               status = bundle_start(registration->bundle);
-               if (status == CELIX_SUCCESS) {
-               }
-       }
-
-       return status;
-}
-
-celix_status_t exportRegistration_close(export_registration_pt registration) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       exportRegistration_stopTracking(registration);
-
-       bundle_uninstall(registration->bundle);
-
-
-       return status;
-}
-
-celix_status_t exportRegistration_getException(export_registration_pt 
registration) {
-       celix_status_t status = CELIX_SUCCESS;
-       return status;
-}
-
-celix_status_t exportRegistration_getExportReference(export_registration_pt 
registration, export_reference_pt *reference) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       registration->exportReference = calloc(1, 
sizeof(*registration->exportReference));
-
-       if (registration->exportReference == NULL) {
-               status = CELIX_ENOMEM;
-       } else {
-               registration->exportReference->endpoint = 
registration->endpointDescription;
-               registration->exportReference->reference = 
registration->reference;
-       }
-       
-       *reference = registration->exportReference;
-
-       return status;
-}
-
-celix_status_t 
exportRegistration_setEndpointDescription(export_registration_pt registration, 
endpoint_description_pt endpointDescription) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       registration->endpointDescription = endpointDescription;
-
-       return status;
-}
-
-celix_status_t exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       *endpoint = reference->endpoint;
-
-       return status;
-}
-
-celix_status_t exportReference_getExportedService(export_reference_pt 
reference, service_reference_pt *service) {
-       celix_status_t status = CELIX_SUCCESS;
-       *service = reference->reference;
-       return status;
-}
-

http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/export_registration_impl.h
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_common/src/export_registration_impl.h 
b/remote_services/remote_service_admin_common/src/export_registration_impl.h
deleted file mode 100644
index bb276f9..0000000
--- a/remote_services/remote_service_admin_common/src/export_registration_impl.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- *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.
- */
-/*
- * export_registration_impl.h
- *
- *  \date       Oct 6, 2011
- *  \author            <a href="mailto:[email protected]";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef EXPORT_REGISTRATION_IMPL_H_
-#define EXPORT_REGISTRATION_IMPL_H_
-
-#include "remote_service_admin.h"
-#include "remote_endpoint.h"
-#include "service_tracker.h"
-#include "log_helper.h"
-
-struct export_registration {
-       bundle_context_pt context;
-       remote_service_admin_pt rsa;
-       endpoint_description_pt endpointDescription;
-       service_reference_pt reference;
-       log_helper_pt loghelper;
-
-       service_tracker_pt tracker;
-       service_tracker_pt endpointTracker;
-
-       remote_endpoint_service_pt endpoint;
-
-       export_reference_pt exportReference;
-       bundle_pt bundle;
-
-       bool closed;
-};
-
-celix_status_t exportRegistration_create(log_helper_pt helper, 
service_reference_pt reference, endpoint_description_pt endpoint, 
remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt 
*registration);
-celix_status_t exportRegistration_destroy(export_registration_pt 
*registration);
-celix_status_t exportRegistration_open(export_registration_pt registration);
-
-celix_status_t 
exportRegistration_setEndpointDescription(export_registration_pt registration, 
endpoint_description_pt endpointDescription);
-celix_status_t exportRegistration_startTracking(export_registration_pt 
registration);
-celix_status_t exportRegistration_stopTracking(export_registration_pt 
registration);
-
-#endif /* EXPORT_REGISTRATION_IMPL_H_ */

Reply via email to