You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2013/09/02 20:52:55 UTC

svn commit: r1519495 - in /incubator/celix/trunk: framework/ framework/private/src/ framework/public/include/ remote_services/discovery_bonjour/ remote_services/discovery_bonjour/private/src/ remote_services/discovery_slp/private/include/ remote_servic...

Author: pnoltes
Date: Mon Sep  2 18:52:54 2013
New Revision: 1519495

URL: http://svn.apache.org/r1519495
Log:
CELIX-65: Updated bonjour support. Updated framework and slp discovery for a  standard approach for framework uuid.  Adjusted remote_service_admin to include a url property so that discovery also will work for a not REST solution. 

Removed:
    incubator/celix/trunk/remote_services/remote_service_admin_http/
    incubator/celix/trunk/remote_services/utils/CMakeLists.txt
    incubator/celix/trunk/remote_services/utils/private/
    incubator/celix/trunk/remote_services/utils/public/include/remote_services_utils.h
Modified:
    incubator/celix/trunk/framework/CMakeLists.txt
    incubator/celix/trunk/framework/private/src/framework.c
    incubator/celix/trunk/framework/public/include/celix_errno.h
    incubator/celix/trunk/framework/public/include/constants.h
    incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt
    incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
    incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
    incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
    incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
    incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
    incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
    incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
    incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
    incubator/celix/trunk/remote_services/remote_service_admin/private/src/import_registration_impl.c
    incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_activator.c
    incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
    incubator/celix/trunk/remote_services/topology_manager/CMakeLists.txt
    incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c
    incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c

Modified: incubator/celix/trunk/framework/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/CMakeLists.txt?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/framework/CMakeLists.txt (original)
+++ incubator/celix/trunk/framework/CMakeLists.txt Mon Sep  2 18:52:54 2013
@@ -58,7 +58,7 @@ if (FRAMEWORK) 
 		${IO}
 	 
 	)
-    target_link_libraries(celix_framework celix_utils ${ZLIB_LIBRARY} ${APR_LIBRARY})
+    target_link_libraries(celix_framework celix_utils ${ZLIB_LIBRARY} ${APR_LIBRARY} ${APRUTIL_LIBRARY})
     
     install(TARGETS celix_framework DESTINATION lib COMPONENT framework)
     FILE(GLOB files "public/include/*.h")

Modified: incubator/celix/trunk/framework/private/src/framework.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/framework.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/framework.c (original)
+++ incubator/celix/trunk/framework/private/src/framework.c Mon Sep  2 18:52:54 2013
@@ -36,6 +36,7 @@
 #include <apr_thread_cond.h>
 #include <apr_thread_mutex.h>
 #include <apr_thread_proc.h>
+#include <apr_uuid.h>
 #ifdef _WIN32
 #include <winbase.h>
 #include <windows.h>
@@ -327,6 +328,14 @@ celix_status_t fw_init(framework_pt fram
 	hash_map_pt wires;
 	array_list_pt archives;
 	bundle_archive_pt archive = NULL;
+	char uuid[APR_UUID_FORMATTED_LENGTH+1];
+
+	/*create and store framework uuid*/
+	apr_uuid_t aprUuid;
+	apr_uuid_get(&aprUuid);
+	apr_uuid_format(uuid, &aprUuid);
+	setenv(FRAMEWORK_UUID, uuid, true);
+
 
 	if (status != CELIX_SUCCESS) {
 		framework_releaseBundleLock(framework, framework->bundle);

Modified: incubator/celix/trunk/framework/public/include/celix_errno.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/public/include/celix_errno.h?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/framework/public/include/celix_errno.h (original)
+++ incubator/celix/trunk/framework/public/include/celix_errno.h Mon Sep  2 18:52:54 2013
@@ -32,12 +32,13 @@
 #define CELIX_ERRNO_H_
 
 #include <errno.h>
+#include <apr_errno.h>
 
 #include "framework_exports.h"
 
 /*!
  * Helper macro which check the current status and executes the provided expression if the
- * status is still CELIX_SUCESS (0)
+ * status is still CELIX_SUCCESS (0)
  */
 #define CELIX_DO_IF(status, expr) ((status) == CELIX_SUCCESS) ? (expr) : (status)
 
@@ -50,7 +51,7 @@
 /*!
  * Status type returned by all functions in Celix
  */
-typedef int celix_status_t;
+typedef apr_status_t celix_status_t;
 
 /*!
  * Return a readable string for the given error code.
@@ -66,7 +67,17 @@ FRAMEWORK_EXPORT char *celix_strerror(ce
 /*!
  * Starting point for Celix errors.
  */
-#define CELIX_START_ERROR 20000
+#define CELIX_START_ERROR APR_OS_START_USERERR
+
+/*!
+ * The range for Celix errors.
+ */
+#define CELIX_ERRSPACE_SIZE 1000
+
+/*!
+ * The start error number user application can use.
+ */
+#define CELIX_START_USERERR (CELIX_START_ERROR + CELIX_ERRSPACE_SIZE)
 
 /*!
  * Exception indicating a problem with a bundle

Modified: incubator/celix/trunk/framework/public/include/constants.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/public/include/constants.h?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/framework/public/include/constants.h (original)
+++ incubator/celix/trunk/framework/public/include/constants.h Mon Sep  2 18:52:54 2013
@@ -45,6 +45,7 @@ static const char * const EXPORT_PACKAGE
 static const char * const IMPORT_PACKAGE = "Import-Service";
 
 static const char * const FRAMEWORK_STORAGE = "org.osgi.framework.storage";
+static const char * const FRAMEWORK_UUID = "org.osgi.framework.uuid";
 
 
 #endif /* CONSTANTS_H_ */

Modified: incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt (original)
+++ incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt Mon Sep  2 18:52:54 2013
@@ -17,7 +17,6 @@
 
 #TODO find_package(DNS-SD REQUIRED)
 
-#TODO include_directories(${SLP_INCLUDE_DIRS})
 include_directories("/usr/include") #TODO check if this has impact on the generated project indexer paths
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/public/include")
@@ -30,8 +29,8 @@ SET_HEADER(BUNDLE_SYMBOLICNAME "apache_c
 SET_HEADERS("Bundle-Name: Apache Celix RSA BONJOUR Discovery")
 
 bundle(discovery_bonjour SOURCES 
-	private/src/discovery 
-	private/src/discovery_activator
+	private/src/discovery.c
+	private/src/discovery_activator.c
 )
 
 target_link_libraries(discovery_bonjour celix_framework ${APRUTIL_LIBRARY}) # TODO ${SLP_LIBRARIES})

Modified: incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c (original)
+++ incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c Mon Sep  2 18:52:54 2013
@@ -19,7 +19,7 @@
 /*
  * discovery.c
  *
- *  \date       Oct 4, 2011
+ *  \date       Sep 1, 2013
  *  \author    	<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
  *  \copyright	Apache License, Version 2.0
  */
@@ -31,6 +31,7 @@
 
 #include <dns_sd.h>
 
+#include "constants.h"
 #include "bundle_context.h"
 #include "array_list.h"
 #include "utils.h"
@@ -38,56 +39,62 @@
 #include "filter.h"
 #include "service_reference.h"
 #include "service_registration.h"
+#include "remote_constants.h"
 
 #include "discovery.h"
 
 static void *APR_THREAD_FUNC discovery_poll(apr_thread_t *thd, void *data);
-static void discovery_browseCallback(
-		    DNSServiceRef sdRef,
-		    DNSServiceFlags flags,
-		    uint32_t interfaceIndex,
-		    DNSServiceErrorType errorCode,
-		    const char                          *serviceName,
-		    const char                          *regtype,
-		    const char                          *replyDomain,
-		    void                                *context
-		);
-static void discovery_resolveCallback
-(
-    DNSServiceRef sdRef,
-    DNSServiceFlags flags,
-    uint32_t interfaceIndex,
-    DNSServiceErrorType errorCode,
-    const char                          *fullname,
-    const char                          *hosttarget,
-    uint16_t port,                                   /* In network byte order */
-    uint16_t txtLen,
-    const unsigned char                 *txtRecord,
-    void                                *context
-);
-static celix_status_t discovery_deregisterEndpoint(discovery_pt discovery, const char *serviceUrl);
-static celix_status_t discovery_addService(discovery_pt discovery, endpoint_description_pt endpoint);
-static celix_status_t discovery_removeService(discovery_pt discovery, endpoint_description_pt endpoint);
+static void discovery_browseCallback(DNSServiceRef sdRef, DNSServiceFlags flags,
+		uint32_t interfaceIndex, DNSServiceErrorType errorCode,
+		const char *serviceName, const char *regtype, const char *replyDomain,
+		void *context);
+static void discovery_resolveAddCallback(DNSServiceRef sdRef,
+		DNSServiceFlags flags, uint32_t interfaceIndex,
+		DNSServiceErrorType errorCode, const char *fullname,
+		const char *hosttarget, uint16_t port, /* In network byte order */
+		uint16_t txtLen, const unsigned char *txtRecord, void *context);
+static void discovery_resolveRemoveCallback(DNSServiceRef sdRef,
+		DNSServiceFlags flags, uint32_t interfaceIndex,
+		DNSServiceErrorType errorCode, const char *fullname,
+		const char *hosttarget, uint16_t port, /* In network byte order */
+		uint16_t txtLen, const unsigned char *txtRecord, void *context);
+static celix_status_t discovery_informEndpointListeners(discovery_pt discovery, endpoint_description_pt endpoint, bool addingService);
 
-static const char * const DEFAULT_RSA_PORT = "555";
+static const char * const DEFAULT_DISCOVERY_PORT = "8889";
 static const char * const OSGI_SERVICE_TYPE = "_osgi._udp";
 
+typedef struct discovered_endpoint_entry {
+	apr_pool_t *pool;
+	endpoint_description_pt endpointDescription;
+} * discovered_endpoint_entry_pt;
+
+typedef struct disclosed_endpoint_entry {
+	apr_pool_t *pool;
+	endpoint_description_pt endpointDescription;
+	TXTRecordRef *txtRecord;
+	DNSServiceRef dnsServiceRef;
+} * disclosed_endpoint_entry_pt;
+
+
 struct discovery {
 	bundle_context_pt context;
 	apr_pool_t *pool;
 
-	hash_map_pt listenerReferences;
 
-	bool running;
+	apr_thread_mutex_t *listenerReferencesMutex;
+	apr_thread_mutex_t *discoveredServicesMutex;
+	apr_thread_mutex_t *disclosedServicesMutex;
+
+	hash_map_pt listenerReferences; //key=serviceReference, value=?? TODO
+	hash_map_pt discoveredServices; //key=endpointId (string), value=discovered_endpoint_entry_pt;
+	hash_map_pt disclosedServices; //key=endpointId (string), value=disclosed_endpoint_entry_pt;
+
+	volatile bool running;
 	apr_thread_t *poll;
 	DNSServiceRef browseRef;
 
-	hash_map_pt slpServices;
-
-	char *rsaPort;
-
-	array_list_pt handled;
-	array_list_pt registered;
+	char *discoveryPort;
+	char *frameworkUuid;
 };
 
 celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context, discovery_pt *discovery) {
@@ -100,18 +107,29 @@ celix_status_t discovery_create(apr_pool
 		(*discovery)->context = context;
 		(*discovery)->pool = pool;
 		(*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL);
-		(*discovery)->slpServices = hashMap_create(string_hash, NULL, string_equals, NULL);
+		(*discovery)->discoveredServices = hashMap_create(string_hash, NULL, string_equals, NULL);
+		(*discovery)->disclosedServices = hashMap_create(string_hash, NULL, string_equals, NULL);
 		(*discovery)->running = true;
 		(*discovery)->browseRef = NULL;
-		(*discovery)->rsaPort = getenv("RSA_PORT");
-		if ((*discovery)->rsaPort == NULL) {
-			printf("No RemoteServiceAdmin port set, set it using RSA_PORT! Using default port (%s)\n", DEFAULT_RSA_PORT);
-			(*discovery)->rsaPort = DEFAULT_RSA_PORT;
+		(*discovery)->discoveryPort = NULL;
+		(*discovery)->listenerReferencesMutex = NULL;
+		(*discovery)->discoveredServicesMutex = NULL;
+		(*discovery)->disclosedServicesMutex = NULL;
+		(*discovery)->frameworkUuid = NULL;
+
+		bundleContext_getProperty(context, FRAMEWORK_UUID, &(*discovery)->frameworkUuid);
+
+		CELIX_DO_IF(status, status = apr_thread_mutex_create(&(*discovery)->listenerReferencesMutex, APR_THREAD_MUTEX_DEFAULT, pool));
+		CELIX_DO_IF(status, status = apr_thread_mutex_create(&(*discovery)->discoveredServicesMutex, APR_THREAD_MUTEX_DEFAULT, pool));
+		CELIX_DO_IF(status, status = apr_thread_mutex_create(&(*discovery)->disclosedServicesMutex, APR_THREAD_MUTEX_DEFAULT, pool));
+
+		char *port = NULL;
+		bundleContext_getProperty(context, "DISCOVERY_PORT", &port);
+		if (port == NULL) {
+			(*discovery)->discoveryPort = DEFAULT_DISCOVERY_PORT;
+		} else {
+			(*discovery)->discoveryPort = apr_pstrdup(pool, port);
 		}
-		(*discovery)->handled = NULL;
-		arrayList_create(pool, &(*discovery)->handled);
-		(*discovery)->registered = NULL;
-		arrayList_create(pool, &(*discovery)->registered);
 
 		DNSServiceErrorType error = DNSServiceBrowse(
 				 &(*discovery)->browseRef,
@@ -122,15 +140,18 @@ celix_status_t discovery_create(apr_pool
 				   discovery_browseCallback,
 				   (*discovery)/* may be NULL */
 				   );
+		if (error != kDNSServiceErr_NoError) {
+			status = CELIX_ILLEGAL_STATE;
+		}
 
-		apr_thread_create(&(*discovery)->poll, NULL, discovery_poll, *discovery, (*discovery)->pool);
+		status = CELIX_DO_IF(status, apr_thread_create(&(*discovery)->poll, NULL, discovery_poll, *discovery, (*discovery)->pool));
 	}
 
 	return status;
 }
 
 celix_status_t discovery_stop(discovery_pt discovery) {
-	celix_status_t status = CELIX_SUCCESS;
+	celix_status_t status;
 
 	apr_status_t tstat;
 	discovery->running = false;
@@ -140,11 +161,37 @@ celix_status_t discovery_stop(discovery_
 		status = CELIX_BUNDLE_EXCEPTION;
 	}
 
-	int i;
-	for (i = 0; i < arrayList_size(discovery->registered); i++) {
-		char *url = arrayList_get(discovery->registered, i);
-		discovery_deregisterEndpoint(discovery, url);
+	apr_thread_mutex_lock(discovery->disclosedServicesMutex);
+	hash_map_iterator_pt iter = hashMapIterator_create(discovery->disclosedServices);
+	while (hashMapIterator_nextEntry(iter)) {
+		hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+		disclosed_endpoint_entry_pt endpointEntry = hashMapEntry_getValue(entry);
+		DNSServiceRefDeallocate(endpointEntry->dnsServiceRef);
 	}
+	hashMapIterator_destroy(iter);
+
+	iter = hashMapIterator_create(discovery->discoveredServices);
+	while (hashMapIterator_hasNext(iter)) {
+		hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+		discovered_endpoint_entry_pt endpointEntry = hashMapEntry_getValue(entry);
+		discovery_informEndpointListeners(discovery, endpointEntry->endpointDescription, false);
+	}
+	hashMapIterator_destroy(iter);
+
+	hashMap_destroy(discovery->disclosedServices, false, false);
+
+	discovery->disclosedServices = NULL;
+	apr_thread_mutex_unlock(discovery->disclosedServicesMutex);
+
+	apr_thread_mutex_lock(discovery->discoveredServicesMutex);
+	hashMap_destroy(discovery->discoveredServices, false, false);
+	discovery->discoveredServices = NULL;
+	apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+
+	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+	hashMap_destroy(discovery->listenerReferences, false, false);
+	discovery->listenerReferences = NULL;
+	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
 
 	return status;
 }
@@ -153,53 +200,96 @@ celix_status_t discovery_endpointAdded(v
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
-	printf("discovery_endpointAdded CALLED\n");
+	printf("DISCOVERY: Endpoint for %s, with filter \"%s\" added\n", endpoint->service, machtedFilter);
+	disclosed_endpoint_entry_pt entry = NULL;
+	apr_pool_t *childPool = NULL;
+	status = apr_pool_create(&childPool, discovery->pool);
+
+	if (status == CELIX_SUCCESS) {
+		entry = apr_palloc(childPool, sizeof(*entry));
+		if (entry == NULL) {
+			status = CELIX_ENOMEM;
+			apr_pool_destroy(childPool);
+		} else {
+			entry->pool = childPool;
+			entry->endpointDescription = endpoint;
+		}
+	}
 
-	DNSServiceRef sdRef = NULL;
-	DNSServiceErrorType error;
-	TXTRecordRef txtRecord;
-
-    TXTRecordCreate (&txtRecord, 256, NULL);//TODO search for correct default record size
-    char serviceId[16];
-    sprintf(serviceId, "%li", endpoint->serviceId);
-
-    TXTRecordSetValue(&txtRecord, "service", strlen(endpoint->service), endpoint->service);
-    TXTRecordSetValue(&txtRecord, "service.id", strlen(serviceId), serviceId);
-
-    hash_map_iterator_pt iter = hashMapIterator_create(endpoint->properties);
-    while (hashMapIterator_hasNext(iter))  {
-    	hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-    	char *key = hashMapEntry_getKey(entry);
-    	char *value = hashMapEntry_getValue(entry);
-    	TXTRecordSetValue(&txtRecord, key, strlen(value), value);
-    }
-
-    int port = atoi(discovery->rsaPort);
-    int portInNetworkByteOrder = ((port << 8) & 0xFF00) | ((port >> 8) & 0xFF); //TODO assuming little endian ?? correct? check with ifdef?
-
-    error = DNSServiceRegister (
-       &sdRef,
-       0,
-       0,
-       endpoint->service, /* may be NULL */
-       OSGI_SERVICE_TYPE,
-       NULL, /* may be NULL */
-       NULL, /* may be NULL */
-       portInNetworkByteOrder, /* In network byte order */
-       TXTRecordGetLength(&txtRecord),
-       TXTRecordGetBytesPtr(&txtRecord), /* may be NULL */
-       NULL, /* may be NULL */
-       NULL /* may be NULL */
-       );
+	if (status == CELIX_SUCCESS) {
+		DNSServiceRef sdRef = NULL;
+		DNSServiceErrorType error;
+		TXTRecordRef txtRecord;
+
+		TXTRecordCreate(&txtRecord, 256, NULL ); //TODO search for correct default record size
+		char serviceId[16];
+		sprintf(serviceId, "%li", endpoint->serviceId);
+
+		TXTRecordSetValue(&txtRecord, "service", strlen(endpoint->service),
+				endpoint->service);
+		TXTRecordSetValue(&txtRecord, "service.id", strlen(serviceId),
+				serviceId);
+		TXTRecordSetValue(&txtRecord, "endpoint.id", strlen(endpoint->id),
+				endpoint->id);
+		TXTRecordSetValue(&txtRecord, "framework.uuid", strlen(discovery->frameworkUuid), discovery->frameworkUuid);
+
+		hash_map_iterator_pt iter = hashMapIterator_create(
+				endpoint->properties);
+		while (hashMapIterator_hasNext(iter)) {
+			hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+			char *key = hashMapEntry_getKey(entry);
+			char *value = hashMapEntry_getValue(entry);
+			TXTRecordSetValue(&txtRecord, key, strlen(value), value);
+		}
+		hashMapIterator_destroy(iter);
+
+		int port = atoi(discovery->discoveryPort);
+		int portInNetworkByteOrder = ((port << 8) & 0xFF00)
+				| ((port >> 8) & 0xFF); //FIXME assuming little endian
+
+		error = DNSServiceRegister(&sdRef, 0, 0, endpoint->service,
+					OSGI_SERVICE_TYPE, NULL,
+					NULL, portInNetworkByteOrder, /* In network byte order */
+					TXTRecordGetLength(&txtRecord), TXTRecordGetBytesPtr(&txtRecord),
+					NULL, NULL );
+
+		if (error != kDNSServiceErr_NoError) {
+			status = CELIX_ILLEGAL_STATE;
+//			printf("Registered record in dns-sd got error code %i\n", error);
+		} else {
+			//entry->txtRecord=txtRecord; TODO
+			entry->dnsServiceRef = sdRef;
+			apr_thread_mutex_lock(discovery->disclosedServicesMutex);
+			if (discovery->disclosedServices != NULL) {
+				hashMap_put(discovery->disclosedServices, endpoint->id, entry);
+			}
+			apr_thread_mutex_unlock(discovery->disclosedServicesMutex);
+		}
+	}
 
 
-    printf("Registered record in dns-sd got error code %i\n", error);
 
 	return status;
 }
 
 celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt endpoint, char *machtedFilter) {
 	celix_status_t status = CELIX_SUCCESS;
+	discovery_pt discovery = handle;
+
+	disclosed_endpoint_entry_pt entry = NULL;
+	apr_thread_mutex_lock(discovery->disclosedServicesMutex);
+	if (discovery->disclosedServices != NULL) {
+		entry = hashMap_remove(discovery->disclosedServices, endpoint->id);
+	}
+	if (entry != NULL) {
+		DNSServiceRefDeallocate(entry->dnsServiceRef);
+		apr_pool_destroy(entry->pool);
+	} else {
+		status = CELIX_ILLEGAL_STATE;
+	}
+	apr_thread_mutex_unlock(discovery->disclosedServicesMutex);
+
+
 	return status;
 }
 
@@ -226,7 +316,11 @@ celix_status_t discovery_endpointListene
 		printf("DISCOVERY: EndpointListener Ignored - Discovery listener\n");
 	} else {
 		printf("DISCOVERY: EndpointListener Added - Add Scope\n");
-		discovery_updateEndpointListener(discovery, reference, (endpoint_listener_pt) service);
+		apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+		if (discovery->listenerReferences != NULL) {
+			hashMap_put(discovery->listenerReferences, reference, NULL /*TODO is the scope value needed?*/);
+		}
+		apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
 	}
 
 	return status;
@@ -236,7 +330,7 @@ celix_status_t discovery_endpointListene
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
-	printf("DISCOVERY: EndpointListener Modified - Update Scope TODO\n");
+//	printf("DISCOVERY: EndpointListener Modified - Update Scope TODO\n");
 
 	return status;
 }
@@ -248,14 +342,12 @@ celix_status_t discovery_endpointListene
 	discovery_pt discovery = handle;
 
 	printf("DISCOVERY: EndpointListener Removed\n");
-	hashMap_remove(discovery->listenerReferences, reference);
-
-	return status;
-}
+	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+	if (discovery->listenerReferences != NULL) {
+		hashMap_remove(discovery->listenerReferences, reference);
+	}
+	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
 
-celix_status_t discovery_updateEndpointListener(discovery_pt discovery,
-		service_reference_pt reference, endpoint_listener_pt service) {
-	celix_status_t status = CELIX_SUCCESS;
 	return status;
 }
 
@@ -276,53 +368,143 @@ static void discovery_browseCallback(DNS
 		void *context) {
 	discovery_pt discovery = context;
 	if (flags & kDNSServiceFlagsAdd) {
-		printf("Added service with %s %s %s\n", serviceName, regtype,
-				replyDomain);
+//		printf("Added service with %s %s %s\n", serviceName, regtype,
+//				replyDomain);
 		DNSServiceRef resolveRef = NULL;
 		DNSServiceErrorType resolveError = DNSServiceResolve(&resolveRef, 0, 0,
-				serviceName, regtype, replyDomain, discovery_resolveCallback,
+				serviceName, regtype, replyDomain, discovery_resolveAddCallback,
 				context);
-		printf("Resolve return with error %i\n", resolveError);
-		DNSServiceProcessResult(resolveRef);
+//		printf("Resolve return with error %i\n", resolveError);
+		if (resolveError == kDNSServiceErr_NoError) {
+			DNSServiceProcessResult(resolveRef);
+		} else {
+			//TODO print error / handle error?
+		}
 	} else {
-		printf("Removed service with %s %s %s\n", serviceName, regtype,
-				replyDomain);
+//		printf("Removed service with %s %s %s\n", serviceName, regtype,
+//				replyDomain);
+		DNSServiceRef resolveRef = NULL;
+		DNSServiceErrorType resolveError = DNSServiceResolve(&resolveRef, 0, 0,
+				serviceName, regtype, replyDomain, discovery_resolveRemoveCallback,
+				context);
+		if (resolveError == kDNSServiceErr_NoError) {
+			DNSServiceProcessResult(resolveRef);
+		} else {
+			//TODO print error / handle error?
+		}
 	}
 }
 
-static void discovery_resolveCallback(DNSServiceRef sdRef,
+static void discovery_resolveRemoveCallback(DNSServiceRef sdRef,
 		DNSServiceFlags flags, uint32_t interfaceIndex,
 		DNSServiceErrorType errorCode, const char *fullname,
 		const char *hosttarget, uint16_t port, /* In network byte order */
 		uint16_t txtLen, const unsigned char *txtRecord, void *context) {
-	printf("In resolve callback!\n");
-	int length = TXTRecordGetCount(txtLen, txtRecord);
-	printf("Found txt record with item count %i\n|", length);
-	for (int i=0; i<length; i+=1) {
-		char key[128];
-		void *value = NULL;
-		int valueSize = 0;
-		TXTRecordGetItemAtIndex(txtLen, txtRecord, i, 128, key, &valueSize, &value);
-		printf("Found key=value %s=%s\n", key, value);
+	discovery_pt discovery = context;
+
+	apr_thread_mutex_lock(discovery->discoveredServicesMutex);
+	discovered_endpoint_entry_pt entry = NULL;
+	if (discovery->discoveredServices != NULL) {
+		entry = hashMap_remove(discovery->discoveredServices, (void *)fullname);
+	}
+	apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+	if (entry != NULL) {
+		discovery_informEndpointListeners(discovery, entry->endpointDescription, true);
+		properties_destroy(entry->endpointDescription->properties);
+		apr_pool_destroy(entry->pool);
+	} else {
+		//unknown or own endpoint -> ignore
 	}
+
 }
 
-static celix_status_t discovery_deregisterEndpoint(discovery_pt discovery, const char *serviceUrl) {
-	celix_status_t status = CELIX_SUCCESS;
-	printf("DISCOVERY: Remove endpoint: %s\n", serviceUrl);
-	printf("TODO\n");
+static void discovery_resolveAddCallback(DNSServiceRef sdRef,
+		DNSServiceFlags flags, uint32_t interfaceIndex,
+		DNSServiceErrorType errorCode, const char *fullname,
+		const char *hosttarget, uint16_t port, /* In network byte order */
+		uint16_t txtLen, const unsigned char *txtRecord, void *context) {
+	discovery_pt discovery = context;
 
-	return status;
-}
+	properties_pt props = properties_create();
+	int length = TXTRecordGetCount(txtLen, txtRecord);
+//	printf("Found txt record with item count %i\n|", length);
+	for (int i = 0; i < length; i += 1) {
+		char key[256];
+		char valueBuf[257]; //max uint8 + 1
+		const void *value = NULL;
+		uint8_t valueSize = 0;
+		TXTRecordGetItemAtIndex(txtLen, txtRecord, i, 256, key, &valueSize,
+				&value);
+		memcpy(valueBuf, value, valueSize);
+		valueBuf[valueSize] = '\0';
+//		printf("Found key=value %s=%s\n", key, valueBuf);
+		properties_set(props, key, valueBuf);
+	}
 
-static celix_status_t discovery_addService(discovery_pt discovery, endpoint_description_pt endpoint) {
-	celix_status_t status = CELIX_SUCCESS;
-	//TODO should be called when dns-sd find a services, forward to listeners
-	return status;
+	//check if framework uuid is not this framework uuid
+	char *endpointUuid = properties_get(props, (char *)ENDPOINT_FRAMEWORK_UUID);
+
+	if (endpointUuid == NULL) {
+		printf("DISCOVERY: Cannot process endpoint, no %s property\n", ENDPOINT_FRAMEWORK_UUID);
+	} else if (strcmp(endpointUuid, discovery->frameworkUuid) != 0) {
+		apr_pool_t *childPool = NULL;
+		apr_pool_create(&childPool, discovery->pool);
+		discovered_endpoint_entry_pt entry = apr_palloc(childPool, sizeof(*entry));
+		endpoint_description_pt endpoint = apr_palloc(childPool, sizeof(*endpoint));
+		//FIXME endpoint id for http should be the url
+		endpoint->id = apr_pstrdup(childPool, fullname);
+		endpoint->serviceId = 0 /*TODO*/;
+		endpoint->service = properties_get(props, "service");
+		endpoint->properties = props;
+		apr_thread_mutex_lock(discovery->discoveredServicesMutex);
+		if (discovery->discoveredServices != NULL) {
+			hashMap_put(discovery->discoveredServices, endpoint->id, entry);
+		}
+		apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+		discovery_informEndpointListeners(discovery, endpoint, true);
+	} else {
+		//ignore self disclosed endpoints!
+		printf("DISCOVERY: Ignoring own endpoint, with service %s!\n", properties_get(props, "service"));
+		properties_destroy(props);
+	}
 }
 
-static celix_status_t discovery_removeService(discovery_pt discovery, endpoint_description_pt endpoint) {
+static celix_status_t discovery_informEndpointListeners(discovery_pt discovery, endpoint_description_pt endpoint, bool endpointAdded) {
 	celix_status_t status = CELIX_SUCCESS;
-	//TODO should be called when dns-sd notices a removal of a services, forward to listeners
+
+	// Inform listeners of new endpoint
+	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+	if (discovery->listenerReferences != NULL) {
+		hash_map_iterator_pt iter = hashMapIterator_create(discovery->listenerReferences);
+		while (hashMapIterator_hasNext(iter)) {
+			hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+			service_reference_pt reference = hashMapEntry_getKey(entry);
+			endpoint_listener_pt listener = NULL;
+
+			service_registration_pt registration = NULL;
+			serviceReference_getServiceRegistration(reference, &registration);
+			properties_pt serviceProperties = NULL;
+			serviceRegistration_getProperties(registration, &serviceProperties);
+			char *scope = properties_get(serviceProperties,
+					(char *) ENDPOINT_LISTENER_SCOPE);
+			filter_pt filter = filter_create(scope, discovery->pool);
+			bool matchResult = false;
+			filter_match(filter, endpoint->properties, &matchResult);
+			if (matchResult) {
+				printf("DISCOVERY: Add service (%s)\n", endpoint->service);
+				bundleContext_getService(discovery->context, reference,
+						(void**) &listener);
+				if (endpointAdded) {
+					listener->endpointAdded(listener->handle, endpoint, NULL );
+				} else {
+					listener->endpointRemoved(listener->handle, endpoint, NULL );
+				}
+
+			}
+		}
+		hashMapIterator_destroy(iter);
+	}
+	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
+
 	return status;
 }

Modified: incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c (original)
+++ incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c Mon Sep  2 18:52:54 2013
@@ -49,10 +49,11 @@ struct activator {
 	service_registration_pt endpointListenerService;
 };
 
-celix_status_t discoveryActivator_createEPLTracker(struct activator *activator, service_tracker_pt *tracker);
-celix_status_t discoveryActivator_getUUID(struct activator *activator, char **uuidStr);
+celix_status_t discoveryActivator_createEPLTracker(struct activator *activator,
+		service_tracker_pt *tracker);
 
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
+celix_status_t bundleActivator_create(bundle_context_pt context,
+		void **userData) {
 	celix_status_t status = CELIX_SUCCESS;
 	apr_pool_t *parentPool = NULL;
 	apr_pool_t *pool = NULL;
@@ -71,7 +72,8 @@ celix_status_t bundleActivator_create(bu
 
 		discovery_create(pool, context, &activator->discovery);
 
-		discoveryActivator_createEPLTracker(activator, &activator->endpointListenerTracker);
+		discoveryActivator_createEPLTracker(activator,
+				&activator->endpointListenerTracker);
 
 		*userData = activator;
 	}
@@ -79,16 +81,20 @@ celix_status_t bundleActivator_create(bu
 	return status;
 }
 
-celix_status_t discoveryActivator_createEPLTracker(struct activator *activator,  service_tracker_pt *tracker) {
+celix_status_t discoveryActivator_createEPLTracker(struct activator *activator,
+		service_tracker_pt *tracker) {
 	celix_status_t status = CELIX_SUCCESS;
 
 	service_tracker_customizer_pt customizer = NULL;
 
-	status = serviceTrackerCustomizer_create(activator->pool, activator->discovery, discovery_endpointListenerAdding,
-			discovery_endpointListenerAdded, discovery_endpointListenerModified, discovery_endpointListenerRemoved, &customizer);
+	status = serviceTrackerCustomizer_create(activator->pool,
+			activator->discovery, discovery_endpointListenerAdding,
+			discovery_endpointListenerAdded, discovery_endpointListenerModified,
+			discovery_endpointListenerRemoved, &customizer);
 
 	if (status == CELIX_SUCCESS) {
-		status = serviceTracker_create(activator->pool, activator->context, "endpoint_listener", customizer, tracker);
+		status = serviceTracker_create(activator->pool, activator->context,
+				(char *) endpoint_listener_service, customizer, tracker);
 
 		serviceTracker_open(activator->endpointListenerTracker);
 	}
@@ -102,7 +108,8 @@ celix_status_t bundleActivator_start(voi
 	apr_pool_t *pool = NULL;
 	apr_pool_create(&pool, activator->pool);
 
-	endpoint_listener_pt endpointListener = apr_palloc(pool, sizeof(*endpointListener));
+	endpoint_listener_pt endpointListener = apr_palloc(pool,
+			sizeof(*endpointListener));
 	endpointListener->handle = activator->discovery;
 	endpointListener->endpointAdded = discovery_endpointAdded;
 	endpointListener->endpointRemoved = discovery_endpointRemoved;
@@ -110,10 +117,13 @@ celix_status_t bundleActivator_start(voi
 	properties_pt props = properties_create();
 	properties_set(props, "DISCOVERY", "true");
 	char *uuid = NULL;
-	discoveryActivator_getUUID(activator, &uuid);
+	bundleContext_getProperty(context, FRAMEWORK_UUID, &uuid);
 	char *scope = apr_pstrcat(activator->pool, "(&(", OBJECTCLASS, "=*)(", ENDPOINT_FRAMEWORK_UUID, "=", uuid, "))", NULL);
+	printf("DISCOVERY SCOPE IS: %s\n", scope);
 	properties_set(props, (char *) ENDPOINT_LISTENER_SCOPE, scope);
-	status = bundleContext_registerService(context, (char *) endpoint_listener_service, endpointListener, props, &activator->endpointListenerService);
+	status = bundleContext_registerService(context,
+			(char *) endpoint_listener_service, endpointListener, props,
+			&activator->endpointListenerService);
 
 	return status;
 }
@@ -122,31 +132,15 @@ celix_status_t bundleActivator_stop(void
 	celix_status_t status = CELIX_SUCCESS;
 	struct activator *activator = userData;
 
-	discovery_stop(activator->discovery);
 	serviceTracker_close(activator->endpointListenerTracker);
 	serviceRegistration_unregister(activator->endpointListenerService);
+	discovery_stop(activator->discovery);
 
 	return status;
 }
 
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
-	celix_status_t status = CELIX_SUCCESS;
-	return status;
-}
-
-celix_status_t discoveryActivator_getUUID(struct activator *activator, char **uuidStr) {
+celix_status_t bundleActivator_destroy(void * userData,
+		bundle_context_pt context) {
 	celix_status_t status = CELIX_SUCCESS;
-
-	status = bundleContext_getProperty(activator->context, ENDPOINT_FRAMEWORK_UUID, uuidStr);
-	if (status == CELIX_SUCCESS) {
-		if (*uuidStr == NULL) {
-			apr_uuid_t uuid;
-			apr_uuid_get(&uuid);
-			*uuidStr = apr_palloc(activator->pool, APR_UUID_FORMATTED_LENGTH + 1);
-			apr_uuid_format(*uuidStr, &uuid);
-			setenv(ENDPOINT_FRAMEWORK_UUID, *uuidStr, 1);
-		}
-	}
-
 	return status;
 }

Modified: incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h (original)
+++ incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h Mon Sep  2 18:52:54 2013
@@ -42,7 +42,7 @@ celix_status_t discovery_endpointListene
 celix_status_t discovery_endpointListenerModified(void * handle, service_reference_pt reference, void * service);
 celix_status_t discovery_endpointListenerRemoved(void * handle, service_reference_pt reference, void * service);
 
-celix_status_t discovery_updateEndpointListener(discovery_pt discovery, service_reference_pt reference, endpoint_listener_pt service);
+//celix_status_t discovery_updateEndpointListener(discovery_pt discovery, service_reference_pt reference, endpoint_listener_pt service);
 
 
 #endif /* DISCOVERY_H_ */

Modified: incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c (original)
+++ incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c Mon Sep  2 18:52:54 2013
@@ -50,7 +50,7 @@ struct discovery {
 
 	hash_map_pt slpServices;
 
-	char *rsaPort;
+	char *discoveryPort;
 
 	array_list_pt handled;
 	array_list_pt registered;
@@ -88,8 +88,8 @@ celix_status_t discovery_create(apr_pool
 		(*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL);
 		(*discovery)->slpServices = hashMap_create(string_hash, NULL, string_equals, NULL);
 		(*discovery)->running = true;
-		(*discovery)->rsaPort = getenv("RSA_PORT");
-		if ((*discovery)->rsaPort == NULL) {
+		(*discovery)->discoveryPort = getenv("RSA_PORT");
+		if ((*discovery)->discoveryPort == NULL) {
 			printf("No RemoteServiceAdmin port set, set it using RSA_PORT!\n");
 		}
 		(*discovery)->handled = NULL;
@@ -224,7 +224,7 @@ celix_status_t discovery_constructServic
 				if (stat != APR_SUCCESS) {
 					status = CELIX_BUNDLE_EXCEPTION;
 				} else {
-					*serviceUrl = apr_pstrcat(discovery->pool, "service:osgi.remote:http://", ip, ":", discovery->rsaPort, "/services/", endpoint->service, NULL);
+					*serviceUrl = apr_pstrcat(discovery->pool, "service:osgi.remote:http://", ip, ":", discovery->discoveryPort, "/services/", endpoint->service, NULL);
 				}
 			}
 		}

Modified: incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c (original)
+++ incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c Mon Sep  2 18:52:54 2013
@@ -50,7 +50,6 @@ struct activator {
 };
 
 celix_status_t discoveryActivator_createEPLTracker(struct activator *activator, service_tracker_pt *tracker);
-celix_status_t discoveryActivator_getUUID(struct activator *activator, char **uuidStr);
 
 celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
 	celix_status_t status = CELIX_SUCCESS;
@@ -110,7 +109,7 @@ celix_status_t bundleActivator_start(voi
 	properties_pt props = properties_create();
 	properties_set(props, "DISCOVERY", "true");
 	char *uuid = NULL;
-	discoveryActivator_getUUID(activator, &uuid);
+	bundleContext_getProperty(activator->context, FRAMEWORK_UUID, &uuid);
 	char *scope = apr_pstrcat(activator->pool, "(&(", OBJECTCLASS, "=*)(", ENDPOINT_FRAMEWORK_UUID, "=", uuid, "))", NULL);
 	properties_set(props, (char *) ENDPOINT_LISTENER_SCOPE, scope);
 	status = bundleContext_registerService(context, (char *) endpoint_listener_service, endpointListener, props, &activator->endpointListenerService);
@@ -133,20 +132,3 @@ celix_status_t bundleActivator_destroy(v
 	celix_status_t status = CELIX_SUCCESS;
 	return status;
 }
-
-celix_status_t discoveryActivator_getUUID(struct activator *activator, char **uuidStr) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	status = bundleContext_getProperty(activator->context, ENDPOINT_FRAMEWORK_UUID, uuidStr);
-	if (status == CELIX_SUCCESS) {
-		if (*uuidStr == NULL) {
-			apr_uuid_t uuid;
-			apr_uuid_get(&uuid);
-			*uuidStr = apr_palloc(activator->pool, APR_UUID_FORMATTED_LENGTH + 1);
-			apr_uuid_format(*uuidStr, &uuid);
-			setenv(ENDPOINT_FRAMEWORK_UUID, *uuidStr, 1);
-		}
-	}
-
-	return status;
-}

Modified: incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c (original)
+++ incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c Mon Sep  2 18:52:54 2013
@@ -67,8 +67,9 @@ celix_status_t exampleProxy_add(example_
 	celix_status_t status = CELIX_SUCCESS;
 
 	if (example->endpoint != NULL) {
-		printf("CALCULATOR_PROXY: URL: %s\n", example->endpoint->id);
-		char *url = apr_pstrcat(example->pool, example->endpoint->id, "/add", NULL);
+		char *serviceUrl = properties_get(example->endpoint->properties, "url");
+		printf("CALCULATOR_PROXY: URL: %s\n", serviceUrl);
+		char *url = apr_pstrcat(example->pool, serviceUrl, "/add", NULL);
 
 		json_t *root;
 		root = json_pack("{s:f, s:f}", "a", a, "b", b);

Modified: incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/example_service/public/include/example_service.h?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/example_service/public/include/example_service.h (original)
+++ incubator/celix/trunk/remote_services/example_service/public/include/example_service.h Mon Sep  2 18:52:54 2013
@@ -40,4 +40,13 @@ struct example_service {
 	celix_status_t (*sqrt)(example_pt example, double a, double *result);
 };
 
+
+/*
+ * interface example_service {
+ * 	double add(double a, double b);
+ * 	double sub(double a, double b);
+ * 	double sqrt(double a);
+ * }
+ */
+
 #endif /* EXAMPLE_SERVICE_H_ */

Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h Mon Sep  2 18:52:54 2013
@@ -50,6 +50,8 @@ struct remote_service_admin {
 	hash_map_pt exportedServices;
 	hash_map_pt importedServices;
 
+	char *port;
+
 	struct mg_context *ctx;
 };
 

Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/src/import_registration_impl.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/src/import_registration_impl.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/src/import_registration_impl.c (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/src/import_registration_impl.c Mon Sep  2 18:52:54 2013
@@ -121,6 +121,7 @@ celix_status_t importRegistration_proxyA
 	celix_status_t status = CELIX_SUCCESS;
 	import_registration_pt registration = handle;
 
+	printf("PROXY added called!");
 	remote_proxy_service_pt proxy = service;
 	if (registration->proxy == NULL) {
 		registration->reference = reference;

Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_activator.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_activator.c (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_activator.c Mon Sep  2 18:52:54 2013
@@ -111,7 +111,6 @@ celix_status_t bundleActivator_stop(void
 	serviceRegistration_unregister(activator->registration);
 	activator->registration = NULL;
 
-
 	return status;
 }
 

Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c Mon Sep  2 18:52:54 2013
@@ -26,7 +26,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <apr_uuid.h>
 #include <apr_strings.h>
 
 #include "remote_service_admin_impl.h"
@@ -46,10 +45,13 @@ static const char *ajax_reply_start =
   "Content-Type: application/x-javascript\r\n"
   "\r\n";
 
+
+static const char *DEFAULT_PORT = "8888";
+
 void *remoteServiceAdmin_callback(enum mg_event event, struct mg_connection *conn, const struct mg_request_info *request_info);
 celix_status_t remoteServiceAdmin_installEndpoint(remote_service_admin_pt admin, export_registration_pt registration, service_reference_pt reference, char *interface);
 celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, properties_pt serviceProperties, properties_pt endpointProperties, char *interface, endpoint_description_pt *description);
-celix_status_t remoteServiceAdmin_getUUID(remote_service_admin_pt rsa, char **uuidStr);
+static celix_status_t constructServiceUrl(remote_service_admin_pt admin, char *service, char **serviceUrl);
 
 celix_status_t remoteServiceAdmin_create(apr_pool_t *pool, bundle_context_pt context, remote_service_admin_pt *admin) {
 	celix_status_t status = CELIX_SUCCESS;
@@ -67,7 +69,9 @@ celix_status_t remoteServiceAdmin_create
 		char *port = NULL;
 		bundleContext_getProperty(context, "RSA_PORT", &port);
 		if (port == NULL) {
-			printf("No RemoteServiceAdmin port set, set it using RSA_PORT!\n");
+			(*admin)->port = DEFAULT_PORT;
+		} else {
+			(*admin)->port = apr_pstrdup(pool, port);
 		}
 		const char *options[] = {"listening_ports", port, NULL};
 		(*admin)->ctx = mg_start(remoteServiceAdmin_callback, (*admin), options);
@@ -252,10 +256,15 @@ celix_status_t remoteServiceAdmin_instal
 	properties_set(endpointProperties, (char *) OBJECTCLASS, interface);
 	properties_set(endpointProperties, (char *) ENDPOINT_SERVICE_ID, serviceId);
 	char *uuid = NULL;
-	remoteServiceAdmin_getUUID(admin, &uuid);
+	bundleContext_getProperty(admin->context, FRAMEWORK_UUID, &uuid);
 	properties_set(endpointProperties, (char *) ENDPOINT_FRAMEWORK_UUID, uuid);
 	char *service = "/services/example";
 	properties_set(endpointProperties, (char *) SERVICE_LOCATION, apr_pstrdup(admin->pool, service));
+    
+    char *url = NULL;
+    constructServiceUrl(admin,interface, &url);
+    printf("url is %s\n", url);
+    properties_set(endpointProperties, "url", url);
 
 	endpoint_description_pt endpointDescription = NULL;
 	remoteServiceAdmin_createEndpointDescription(admin, serviceProperties, endpointProperties, interface, &endpointDescription);
@@ -264,6 +273,39 @@ celix_status_t remoteServiceAdmin_instal
 	return status;
 }
 
+static celix_status_t constructServiceUrl(remote_service_admin_pt admin, char *service, char **serviceUrl) {
+	celix_status_t status = CELIX_SUCCESS;
+    
+	if (*serviceUrl != NULL || admin == NULL || service == NULL ) {
+		status = CELIX_ILLEGAL_ARGUMENT;
+	} else {
+		char host[APRMAXHOSTLEN + 1];
+		apr_sockaddr_t *sa;
+		char *ip;
+        
+		apr_status_t stat = apr_gethostname(host, APRMAXHOSTLEN + 1, admin->pool); /*TODO mem leak*/
+		if (stat != APR_SUCCESS) {
+			status = CELIX_BUNDLE_EXCEPTION;
+		} else {
+			stat = apr_sockaddr_info_get(&sa, host, APR_INET, 0, 0, admin->pool); /*TODO mem leak*/
+			if (stat != APR_SUCCESS) {
+				status = CELIX_BUNDLE_EXCEPTION;
+			} else {
+				stat = apr_sockaddr_ip_get(&ip, sa);
+				if (stat != APR_SUCCESS) {
+					status = CELIX_BUNDLE_EXCEPTION;
+				} else {
+					*serviceUrl = apr_pstrcat(admin->pool, "http://", ip, ":", admin->port, "/services/", service,	NULL );
+				}
+			}
+		}
+	}
+    
+	return status;
+}
+
+
+
 celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, properties_pt serviceProperties,
 		properties_pt endpointProperties, char *interface, endpoint_description_pt *description) {
 	celix_status_t status = CELIX_SUCCESS;
@@ -277,7 +319,7 @@ celix_status_t remoteServiceAdmin_create
 		status = CELIX_ENOMEM;
 	} else {
 		char *uuid = NULL;
-		status = bundleContext_getProperty(admin->context, ENDPOINT_FRAMEWORK_UUID, &uuid);
+		status = bundleContext_getProperty(admin->context, (char *)FRAMEWORK_UUID, &uuid);
 		if (status == CELIX_SUCCESS) {
 			(*description)->properties = endpointProperties;
 			(*description)->frameworkUUID = uuid;
@@ -342,20 +384,3 @@ celix_status_t importReference_getImport
 	celix_status_t status = CELIX_SUCCESS;
 	return status;
 }
-
-celix_status_t remoteServiceAdmin_getUUID(remote_service_admin_pt rsa, char **uuidStr) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	status = bundleContext_getProperty(rsa->context, ENDPOINT_FRAMEWORK_UUID, uuidStr);
-	if (status == CELIX_SUCCESS) {
-		if (*uuidStr == NULL) {
-			apr_uuid_t uuid;
-			apr_uuid_get(&uuid);
-			*uuidStr = apr_palloc(rsa->pool, APR_UUID_FORMATTED_LENGTH + 1);
-			apr_uuid_format(*uuidStr, &uuid);
-			setenv(ENDPOINT_FRAMEWORK_UUID, *uuidStr, 1);
-		}
-	}
-
-	return status;
-}

Modified: incubator/celix/trunk/remote_services/topology_manager/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/CMakeLists.txt?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/CMakeLists.txt (original)
+++ incubator/celix/trunk/remote_services/topology_manager/CMakeLists.txt Mon Sep  2 18:52:54 2013
@@ -31,4 +31,4 @@ bundle(topology_manager SOURCES
     private/include/topology_manager.h
 )
 
-target_link_libraries(topology_manager celix_framework remote_services_utils ${APRUTIL_LIBRARY})
+target_link_libraries(topology_manager celix_framework ${APRUTIL_LIBRARY})

Modified: incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c (original)
+++ incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c Mon Sep  2 18:52:54 2013
@@ -39,8 +39,6 @@
 #include "remote_constants.h"
 #include "listener_hook_service.h"
 
-#include "remote_services_utils.h"
-
 struct activator {
 	apr_pool_t *pool;
 	bundle_context_pt context;
@@ -139,8 +137,9 @@ celix_status_t bundleActivator_start(voi
 
 	properties_pt props = properties_create();
 	char *uuid = NULL;
-	remoteServicesUtils_getUUID(pool, context, &uuid);
+	bundleContext_getProperty(activator->context, (char *)FRAMEWORK_UUID, &uuid);
 	char *scope = apr_pstrcat(pool, "(&(", OBJECTCLASS, "=*)(!(", ENDPOINT_FRAMEWORK_UUID, "=", uuid, ")))", NULL);
+	printf("TOPOLOGY_MANAGER: Endpoint listener Scope is %s\n", scope);
 	properties_set(props, (char *) ENDPOINT_LISTENER_SCOPE, scope);
 
 	bundleContext_registerService(context, (char *) endpoint_listener_service, endpointListener, props, &activator->endpointListenerService);

Modified: incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c?rev=1519495&r1=1519494&r2=1519495&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c (original)
+++ incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c Mon Sep  2 18:52:54 2013
@@ -61,8 +61,6 @@ struct import_interest {
 celix_status_t topologyManager_notifyListeners(topology_manager_pt manager, remote_service_admin_service_pt rsa,  array_list_pt registrations);
 celix_status_t topologyManager_notifyListenersOfRemoval(topology_manager_pt manager, remote_service_admin_service_pt rsa,  export_registration_pt export);
 
-celix_status_t topologyManager_getUUID(topology_manager_pt manager, char **uuidStr);
-
 celix_status_t topologyManager_create(bundle_context_pt context, apr_pool_t *pool, topology_manager_pt *manager) {
 	celix_status_t status = CELIX_SUCCESS;
 
@@ -344,7 +342,7 @@ celix_status_t topologyManager_extendFil
 	apr_pool_create(&pool, manager->pool);
 
 	char *uuid = NULL;
-	topologyManager_getUUID(manager, &uuid);
+	bundleContext_getProperty(manager->context, (char *)FRAMEWORK_UUID, &uuid);
 	*updatedFilter = apr_pstrcat(pool, "(&", filter, "(!(", ENDPOINT_FRAMEWORK_UUID, "=", uuid, ")))", NULL);
 
 	return status;
@@ -421,22 +419,3 @@ celix_status_t topologyManager_listenerR
 
 	return status;
 }
-
-celix_status_t topologyManager_getUUID(topology_manager_pt manager, char **uuidStr) {
-	celix_status_t status = CELIX_SUCCESS;
-	apr_pool_t *pool = NULL;
-	apr_pool_create(&pool, manager->pool);
-
-	status = bundleContext_getProperty(manager->context, ENDPOINT_FRAMEWORK_UUID, uuidStr);
-	if (status == CELIX_SUCCESS) {
-		if (*uuidStr == NULL) {
-			apr_uuid_t uuid;
-			apr_uuid_get(&uuid);
-			*uuidStr = apr_palloc(pool, APR_UUID_FORMATTED_LENGTH + 1);
-			apr_uuid_format(*uuidStr, &uuid);
-			setenv(ENDPOINT_FRAMEWORK_UUID, *uuidStr, 1);
-		}
-	}
-
-	return status;
-}