You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2014/08/13 10:46:10 UTC

svn commit: r1617689 [1/2] - in /celix/trunk: framework/private/src/ framework/public/include/ remote_services/ remote_services/calculator_endpoint/ remote_services/calculator_endpoint/private/src/ remote_services/calculator_proxy/ remote_services/calc...

Author: abroekhuis
Date: Wed Aug 13 08:46:09 2014
New Revision: 1617689

URL: http://svn.apache.org/r1617689
Log:
CELIX-136: Applied patch.

Added:
    celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_common.h
    celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_server.h
    celix/trunk/remote_services/discovery_configured/private/src/endpoint_discovery_server.c
    celix/trunk/remote_services/utils/private/
    celix/trunk/remote_services/utils/private/include/
    celix/trunk/remote_services/utils/private/include/civetweb.h
      - copied, changed from r1613832, celix/trunk/remote_services/remote_service_admin_http/private/include/civetweb.h
    celix/trunk/remote_services/utils/private/src/
    celix/trunk/remote_services/utils/private/src/civetweb.c
      - copied, changed from r1613832, celix/trunk/remote_services/remote_service_admin_http/private/src/civetweb.c
    celix/trunk/remote_services/utils/private/src/md5.inl
      - copied, changed from r1613832, celix/trunk/remote_services/remote_service_admin_http/private/src/md5.inl
Removed:
    celix/trunk/remote_services/remote_service_admin_http/private/include/civetweb.h
    celix/trunk/remote_services/remote_service_admin_http/private/src/civetweb.c
    celix/trunk/remote_services/remote_service_admin_http/private/src/md5.inl
Modified:
    celix/trunk/framework/private/src/utils.c
    celix/trunk/framework/public/include/service_tracker.h
    celix/trunk/remote_services/calculator_endpoint/CMakeLists.txt
    celix/trunk/remote_services/calculator_endpoint/private/src/calculator_endpoint_impl.c
    celix/trunk/remote_services/calculator_proxy/CMakeLists.txt
    celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_activator.c
    celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_impl.c
    celix/trunk/remote_services/calculator_service/CMakeLists.txt
    celix/trunk/remote_services/calculator_service/public/include/calculator_service.h
    celix/trunk/remote_services/calculator_shell/CMakeLists.txt
    celix/trunk/remote_services/deploy.cmake
    celix/trunk/remote_services/discovery_configured/CMakeLists.txt
    celix/trunk/remote_services/discovery_configured/private/include/discovery.h
    celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_reader.h
    celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_poller.h
    celix/trunk/remote_services/discovery_configured/private/src/discovery.c
    celix/trunk/remote_services/discovery_configured/private/src/discovery_activator.c
    celix/trunk/remote_services/discovery_configured/private/src/endpoint_descriptor_reader.c
    celix/trunk/remote_services/discovery_configured/private/src/endpoint_descriptor_writer.c
    celix/trunk/remote_services/discovery_configured/private/src/endpoint_discovery_poller.c
    celix/trunk/remote_services/remote_service_admin/private/src/endpoint_description.c
    celix/trunk/remote_services/remote_service_admin/public/include/endpoint_description.h
    celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt
    celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c
    celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
    celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
    celix/trunk/remote_services/topology_manager/private/src/topology_manager.c
    celix/trunk/remote_services/utils/public/include/remote_constants.h

Modified: celix/trunk/framework/private/src/utils.c
URL: http://svn.apache.org/viewvc/celix/trunk/framework/private/src/utils.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/framework/private/src/utils.c (original)
+++ celix/trunk/framework/private/src/utils.c Wed Aug 13 08:46:09 2014
@@ -68,14 +68,16 @@ char * utils_stringTrim(char * string) {
 
 	char *end;
 	// Trim leading space
-	while(isspace(*copy)) copy++;
+	while (isspace(*copy)) {
+		copy++;
+	}
 
 	// Trim trailing space
 	end = copy + strlen(copy) - 1;
-	while(end > copy && isspace(*end)) end--;
-
-	// Write new null terminator
-	*(end+1) = 0;
+	while(end > copy && isspace(*end)) {
+		*(end) = 0;
+		end--;
+	}
 
 	return copy;
 }

Modified: celix/trunk/framework/public/include/service_tracker.h
URL: http://svn.apache.org/viewvc/celix/trunk/framework/public/include/service_tracker.h?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/framework/public/include/service_tracker.h (original)
+++ celix/trunk/framework/public/include/service_tracker.h Wed Aug 13 08:46:09 2014
@@ -40,6 +40,7 @@ FRAMEWORK_EXPORT celix_status_t serviceT
 
 FRAMEWORK_EXPORT celix_status_t serviceTracker_open(service_tracker_pt tracker);
 FRAMEWORK_EXPORT celix_status_t serviceTracker_close(service_tracker_pt tracker);
+FRAMEWORK_EXPORT celix_status_t serviceTracker_destroy(service_tracker_pt tracker);
 
 FRAMEWORK_EXPORT service_reference_pt serviceTracker_getServiceReference(service_tracker_pt tracker);
 FRAMEWORK_EXPORT array_list_pt serviceTracker_getServiceReferences(service_tracker_pt tracker);

Modified: celix/trunk/remote_services/calculator_endpoint/CMakeLists.txt
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_endpoint/CMakeLists.txt?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_endpoint/CMakeLists.txt (original)
+++ celix/trunk/remote_services/calculator_endpoint/CMakeLists.txt Wed Aug 13 08:46:09 2014
@@ -17,7 +17,7 @@
 
 find_package(Jansson REQUIRED)
 
-include_directories(${JANSSON_INCLUDE_DIRS})
+include_directories("${JANSSON_INCLUDE_DIRS}")
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_endpoint/private/include")
@@ -26,11 +26,11 @@ include_directories("${PROJECT_SOURCE_DI
 SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator_endpoint")
 SET(BUNDLE_VERSION "0.0.1")
 
-bundle(org.example.api.Calculator_endpoint SOURCES 
+bundle(org.apache.celix.calc.api.Calculator_endpoint SOURCES 
 	private/src/calculator_endpoint_activator
 	private/src/calculator_endpoint_impl.c
     
     private/include/calculator_endpoint_impl.h
 )
 
-target_link_libraries(org.example.api.Calculator_endpoint celix_framework ${JANSSON_LIBRARIES})
+target_link_libraries(org.apache.celix.calc.api.Calculator_endpoint celix_framework ${JANSSON_LIBRARIES})

Modified: celix/trunk/remote_services/calculator_endpoint/private/src/calculator_endpoint_impl.c
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_endpoint/private/src/calculator_endpoint_impl.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_endpoint/private/src/calculator_endpoint_impl.c (original)
+++ celix/trunk/remote_services/calculator_endpoint/private/src/calculator_endpoint_impl.c Wed Aug 13 08:46:09 2014
@@ -92,7 +92,7 @@ celix_status_t calculatorEndpoint_add(re
 			json_t *resultRoot;
 			calculator_service_pt service = endpoint->service;
 			service->add(service->calculator, a, b, &result);
-			resultRoot = json_pack("[f]", result);
+			resultRoot = json_pack("f", result);
 
 			char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
 			*reply = c;
@@ -123,7 +123,7 @@ celix_status_t calculatorEndpoint_sub(re
 			json_t *resultRoot;
 			calculator_service_pt service = endpoint->service;
 			service->sub(service->calculator, a, b, &result);
-			resultRoot = json_pack("[f]", result);
+			resultRoot = json_pack("f", result);
 
 			char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
 			*reply = c;
@@ -153,7 +153,7 @@ celix_status_t calculatorEndpoint_sqrt(r
 			json_t *resultRoot;
 			calculator_service_pt service = endpoint->service;
 			service->sqrt(service->calculator, a, &result);
-			resultRoot = json_pack("[f]", result);
+			resultRoot = json_pack("f", result);
 
 			char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
 			*reply = c;

Modified: celix/trunk/remote_services/calculator_proxy/CMakeLists.txt
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_proxy/CMakeLists.txt?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_proxy/CMakeLists.txt (original)
+++ celix/trunk/remote_services/calculator_proxy/CMakeLists.txt Wed Aug 13 08:46:09 2014
@@ -17,7 +17,7 @@
 
 find_package(Jansson REQUIRED)
 
-include_directories(${JANSSON_INCLUDE_DIRS})
+include_directories("${JANSSON_INCLUDE_DIRS}")
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_proxy/private/include")
@@ -27,11 +27,11 @@ include_directories("${PROJECT_SOURCE_DI
 SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator_proxy")
 SET(BUNDLE_VERSION "0.0.1")
 
-bundle(org.example.api.Calculator_proxy SOURCES 
+bundle(org.apache.celix.calc.api.Calculator_proxy SOURCES 
 	private/src/calculator_proxy_activator
 	private/src/calculator_proxy_impl.c
     
     private/include/calculator_proxy_impl.h
 )
 
-target_link_libraries(org.example.api.Calculator_proxy celix_framework ${JANSSON_LIBRARIES})
+target_link_libraries(org.apache.celix.calc.api.Calculator_proxy celix_framework ${JANSSON_LIBRARIES})

Modified: celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_activator.c
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_activator.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_activator.c (original)
+++ celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_activator.c Wed Aug 13 08:46:09 2014
@@ -77,7 +77,7 @@ celix_status_t bundleActivator_start(voi
 	properties_pt props = properties_create();
 	properties_set(props, (char *) "proxy.interface", (char *) CALCULATOR_SERVICE);
 
-	if (bundleContext_registerService(context, OSGI_RSA_REMOTE_PROXY_FACTORY, calculatorProxyFactoryService, props, &activator->proxyFactoryService) == CELIX_SUCCESS);
+	if (bundleContext_registerService(context, OSGI_RSA_REMOTE_PROXY_FACTORY, calculatorProxyFactoryService, props, &activator->proxyFactoryService) == CELIX_SUCCESS)
 	{
 		printf("CALCULATOR_PROXY: Proxy registered OSGI_RSA_REMOTE_PROXY_FACTORY (%s)\n", OSGI_RSA_REMOTE_PROXY_FACTORY);
 	}

Modified: celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_impl.c
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_impl.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_impl.c (original)
+++ celix/trunk/remote_services/calculator_proxy/private/src/calculator_proxy_impl.c Wed Aug 13 08:46:09 2014
@@ -50,7 +50,6 @@ celix_status_t calculatorProxy_create(ap
 		(*calculator)->endpoint = NULL;
 		(*calculator)->sendToCallback=NULL;
 		(*calculator)->sendToHandler=NULL;
-
 	}
 
 	return status;
@@ -65,21 +64,27 @@ celix_status_t calculatorProxy_add(calcu
 		root = json_pack("{s:s, s:[ff]}", "m", "add(DD)D", "a", a, b);
 
 		char *data = json_dumps(root, 0);
-		char *reply = calloc(128, sizeof(char));
+		char *reply = malloc(256);
 		int replyStatus = 0;
 
-		printf("Send: %s\n", data);
-
 		calculator->sendToCallback(calculator->sendToHandler, calculator->endpoint, data, &reply, &replyStatus);
 
 		if (status == CELIX_SUCCESS) {
-			json_error_t jsonError;
-			json_t *js_reply = json_loads(reply, 0, &jsonError);
-            json_unpack(js_reply, "[f]", result);
+			json_error_t error;
+			json_t *js_reply = json_loads(reply, JSON_DECODE_ANY, &error);
+			if (js_reply) {
+				json_unpack(js_reply, "f", result);
+			} else {
+				printf("PROXY: got error '%s' for '%s'\n", error.text, reply);
+				status = CELIX_BUNDLE_EXCEPTION;
+			}
 		}
 
+		free(data);
+		free(reply);
 	} else {
 		printf("CALCULATOR_PROXY: No endpoint information available\n");
+		status = CELIX_BUNDLE_EXCEPTION;
 	}
 
 	return status;
@@ -92,18 +97,27 @@ celix_status_t calculatorProxy_sub(calcu
 		root = json_pack("{s:s, s:[ff]}", "m", "sub(DD)D", "a", a, b);
 
 		char *data = json_dumps(root, 0);
-		char *reply = calloc(128, sizeof(char));
+		char *reply = malloc(128);
 		int replyStatus = 0;
 
 		calculator->sendToCallback(calculator->sendToHandler, calculator->endpoint, data, &reply, &replyStatus);
 
 		if (status == CELIX_SUCCESS) {
-			json_error_t jsonError;
-			json_t *js_reply = json_loads(reply, 0, &jsonError);
-			json_unpack(js_reply, "[f]", result);
+			json_error_t error;
+			json_t *js_reply = json_loads(reply, JSON_DECODE_ANY, &error);
+			if (js_reply) {
+				json_unpack(js_reply, "f", result);
+			} else {
+				printf("PROXY: got error '%s' for '%s'\n", error.text, reply);
+				status = CELIX_BUNDLE_EXCEPTION;
+			}
 		}
+
+		free(data);
+		free(reply);
 	} else {
 		printf("CALCULATOR_PROXY: No endpoint information available\n");
+		status = CELIX_BUNDLE_EXCEPTION;
 	}
 
 	return status;
@@ -116,18 +130,27 @@ celix_status_t calculatorProxy_sqrt(calc
 		root = json_pack("{s:s, s:[f]}", "m", "sqrt(D)D", "a", a);
 
 		char *data = json_dumps(root, 0);
-		char *reply = calloc(128, sizeof(char));
+		char *reply = malloc(128);
 		int replyStatus;
 
 		calculator->sendToCallback(calculator->sendToHandler, calculator->endpoint, data, &reply, &replyStatus);
 
 		if (status == CELIX_SUCCESS) {
-			json_error_t jsonError;
-			json_t *js_reply = json_loads(reply, 0, &jsonError);
-			json_unpack(js_reply, "[f]", result);
+			json_error_t error;
+			json_t *js_reply = json_loads(reply, JSON_DECODE_ANY, &error);
+			if (js_reply) {
+				json_unpack(js_reply, "f", result);
+			} else {
+				printf("PROXY: got error '%s' for '%s'\n", error.text, reply);
+				status = CELIX_BUNDLE_EXCEPTION;
+			}
 		}
+
+		free(data);
+		free(reply);
 	} else {
 		printf("CALCULATOR_PROXY: No endpoint information available\n");
+		status = CELIX_BUNDLE_EXCEPTION;
 	}
 
 	return status;

Modified: celix/trunk/remote_services/calculator_service/CMakeLists.txt
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_service/CMakeLists.txt?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_service/CMakeLists.txt (original)
+++ celix/trunk/remote_services/calculator_service/CMakeLists.txt Wed Aug 13 08:46:09 2014
@@ -21,7 +21,7 @@ include_directories("${PROJECT_SOURCE_DI
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_service/private/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_service/public/include")
 
-SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator")
+SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator_impl")
 SET(BUNDLE_VERSION "0.0.1")
 
 bundle(calculator SOURCES 

Modified: celix/trunk/remote_services/calculator_service/public/include/calculator_service.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_service/public/include/calculator_service.h?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_service/public/include/calculator_service.h (original)
+++ celix/trunk/remote_services/calculator_service/public/include/calculator_service.h Wed Aug 13 08:46:09 2014
@@ -27,12 +27,21 @@
 #ifndef CALCULATOR_SERVICE_H_
 #define CALCULATOR_SERVICE_H_
 
-#define CALCULATOR_SERVICE "org.example.api.Calculator"
+#define CALCULATOR_SERVICE "org.apache.celix.calc.api.Calculator"
 
 typedef struct calculator *calculator_pt;
 
 typedef struct calculator_service *calculator_service_pt;
 
+/*
+ * The calculator service definition corresponds to the following Java interface:
+ *
+ * interface Calculator {
+ * 	 double add(double a, double b);
+ * 	 double sub(double a, double b);
+ * 	 double sqrt(double a);
+ * }
+ */
 struct calculator_service {
 	calculator_pt calculator;
 	celix_status_t (*add)(calculator_pt calculator, double a, double b, double *result);
@@ -41,12 +50,5 @@ struct calculator_service {
 };
 
 
-/*
- * interface calculator_service {
- * 	double add(double a, double b);
- * 	double sub(double a, double b);
- * 	double sqrt(double a);
- * }
- */
 
 #endif /* CALCULATOR_SERVICE_H_ */

Modified: celix/trunk/remote_services/calculator_shell/CMakeLists.txt
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/calculator_shell/CMakeLists.txt?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/calculator_shell/CMakeLists.txt (original)
+++ celix/trunk/remote_services/calculator_shell/CMakeLists.txt Wed Aug 13 08:46:09 2014
@@ -15,14 +15,19 @@
 # specific language governing permissions and limitations
 # under the License.
 
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_shell/private/include")
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_service/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/shell/public/include")
+
 SET(BUNDLE_SYMBOLICNAME "apache_celix_remoting_calculator_shell")
 SET(BUNDLE_VERSION "0.0.1")
 
 bundle(calculator_shell SOURCES
-	private/src/add_command 
-	private/src/sub_command
-	private/src/sqrt_command
-	private/src/calculator_shell_activator
+    private/src/add_command 
+    private/src/sub_command
+    private/src/sqrt_command
+    private/src/calculator_shell_activator
     
     private/include/add_command.h
     private/include/sqrt_command.h
@@ -30,9 +35,4 @@ bundle(calculator_shell SOURCES
     ${PROJECT_SOURCE_DIR}/shell/public/src/command.c
 )
 
-include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_shell/private/include")
-include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-include_directories("${PROJECT_SOURCE_DIR}/remote_services/calculator_service/public/include")
-include_directories("${PROJECT_SOURCE_DIR}/shell/public/include")
 target_link_libraries(calculator_shell celix_framework)
-

Modified: celix/trunk/remote_services/deploy.cmake
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/deploy.cmake?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/deploy.cmake (original)
+++ celix/trunk/remote_services/deploy.cmake Wed Aug 13 08:46:09 2014
@@ -17,13 +17,20 @@
 is_enabled(REMOTE_SERVICE_ADMIN)
 if (REMOTE_SERVICE_ADMIN)
 	deploy("remote-services-bj" BUNDLES discovery_bonjour topology_manager remote_service_admin_http calculator shell shell_tui log_service log_writer 
-	                            ENDPOINTS org.example.api.Calculator_endpoint)
+	                            ENDPOINTS org.apache.celix.calc.api.Calculator_endpoint)
 	deploy("remote-services-bj-client" BUNDLES topology_manager remote_service_admin_http shell shell_tui log_service log_writer calculator_shell discovery_bonjour
-	                                   ENDPOINTS org.example.api.Calculator_proxy)
-	                                   
-	deploy("remote-services" BUNDLES discovery_slp topology_manager remote_service_admin_http calculator org.example.api.Calculator_endpoint shell shell_tui log_service log_writer)
-	deploy("remote-services-client" BUNDLES topology_manager remote_service_admin_http org.example.api.Calculator_proxy shell shell_tui log_service log_writer calculator_shell discovery_slp)
-	
+	                                   ENDPOINTS org.apache.celix.calc.api.Calculator_proxy)
+
+	deploy("remote-services-slp" BUNDLES discovery_slp topology_manager remote_service_admin_http calculator shell shell_tui log_service log_writer
+	                             ENDPOINTS org.apache.celix.calc.api.Calculator_endpoint)
+	deploy("remote-services-slp-client" BUNDLES topology_manager remote_service_admin_http shell shell_tui log_service log_writer calculator_shell discovery_slp
+	                                    ENDPOINTS org.apache.celix.calc.api.Calculator_proxy)
+
+    deploy("remote-services-cfg" BUNDLES discovery_configured topology_manager remote_service_admin_http calculator shell shell_tui log_service log_writer
+                                 ENDPOINTS org.apache.celix.calc.api.Calculator_endpoint)
+    deploy("remote-services-cfg-client" BUNDLES topology_manager remote_service_admin_http shell shell_tui log_service log_writer calculator_shell discovery_configured
+                                        ENDPOINTS org.apache.celix.calc.api.Calculator_proxy)
+
 	#TODO for remote-service-client the discovery should be added as last. If this is not done, 
 	#discovery will discover services before the topology manager is registered as 
 	#endpoint listener and services will be lost. This needs further study.
@@ -34,8 +41,8 @@ if (RSA_BUNDLES_REMOTE_SERVICE_ADMIN_SHM
     is_enabled(RSA_BUNDLES_DISCOVERY_SHM)
     if (RSA_BUNDLES_DISCOVERY_SHM)
         deploy("remote-services-shm" BUNDLES discovery_shm topology_manager remote_service_admin_shm calculator shell shell_tui log_service log_writer 
-                                     ENDPOINTS org.example.api.Calculator_endpoint)
+                                     ENDPOINTS org.apache.celix.calc.api.Calculator_endpoint)
         deploy("remote-services-shm-client" BUNDLES topology_manager remote_service_admin_shm shell shell_tui log_service log_writer calculator_shell discovery_shm
-                                            ENDPOINTS org.example.api.Calculator_proxy)
+                                            ENDPOINTS org.apache.celix.calc.api.Calculator_proxy)
     endif (RSA_BUNDLES_DISCOVERY_SHM)
 endif (RSA_BUNDLES_REMOTE_SERVICE_ADMIN_SHM)

Modified: celix/trunk/remote_services/discovery_configured/CMakeLists.txt
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/CMakeLists.txt?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/CMakeLists.txt (original)
+++ celix/trunk/remote_services/discovery_configured/CMakeLists.txt Wed Aug 13 08:46:09 2014
@@ -15,46 +15,49 @@
 # specific language governing permissions and limitations
 # under the License.
 
-#TODO find_package(DNS-SD REQUIRED)
-
 find_package(CURL REQUIRED)
 find_package(LibXml2 REQUIRED)
-include_directories(${LIBXML2_INCLUDE_DIR})
-
 
-include_directories("/usr/include") #TODO check if this has impact on the generated project indexer paths
+include_directories("${CURL_INCLUDE_DIR}")
+include_directories("${LIBXML2_INCLUDE_DIR}")
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/private/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/discovery_configured/private/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/endpoint_listener/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
 include_directories(private/include)
 
-include_directories("${CURL_INCLUDE_DIR}")
-
 SET_HEADER(BUNDLE_SYMBOLICNAME "apache_celix_rsa_discovery_configured")
 SET_HEADERS("Bundle-Name: Apache Celix RSA Configured Discovery")
 
 bundle(discovery_configured SOURCES 
 	private/src/discovery.c
 	private/src/discovery_activator.c
+    private/src/endpoint_descriptor_reader.c
+    private/src/endpoint_descriptor_writer.c
 	private/src/endpoint_discovery_poller.c
+    private/src/endpoint_discovery_server.c
+    ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c
+    ${PROJECT_SOURCE_DIR}/remote_services/utils/private/src/civetweb.c
 )
     
 install_bundle(discovery_configured)
 
-target_link_libraries(discovery_configured celix_framework ${CURL_LIBRARIES} ${APRUTIL_LIBRARY})
-
-add_executable(descparser 
-    private/src/endpoint_descriptor_reader.c
-    ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c)
-    
-target_link_libraries(descparser ${LIBXML2_LIBRARIES} celix_framework celix_utils)
-
-
-add_executable(descwriter 
-    private/src/endpoint_descriptor_writer.c
-    ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c)
-    
-target_link_libraries(descwriter ${LIBXML2_LIBRARIES} celix_framework celix_utils)
+target_link_libraries(discovery_configured celix_framework ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES} ${APRUTIL_LIBRARY})
 
+if (RSA_ENDPOINT_TEST_READER)
+    add_executable(descparser 
+        private/src/endpoint_descriptor_reader.c
+        ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c)
+        
+    target_link_libraries(descparser ${LIBXML2_LIBRARIES} celix_framework celix_utils)
+endif (RSA_ENDPOINT_TEST_READER)
+
+if (RSA_ENDPOINT_TEST_WRITER)
+    add_executable(descwriter 
+        private/src/endpoint_descriptor_writer.c
+        ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c)
+        
+    target_link_libraries(descwriter ${LIBXML2_LIBRARIES} celix_framework celix_utils)
+endif(RSA_ENDPOINT_TEST_WRITER)
\ No newline at end of file

Modified: celix/trunk/remote_services/discovery_configured/private/include/discovery.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/include/discovery.h?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/include/discovery.h (original)
+++ celix/trunk/remote_services/discovery_configured/private/include/discovery.h Wed Aug 13 08:46:09 2014
@@ -27,16 +27,18 @@
 #ifndef DISCOVERY_H_
 #define DISCOVERY_H_
 
-#include <apr_general.h>
-
 #include "bundle_context.h"
 #include "service_reference.h"
 
+#include "endpoint_description.h"
 #include "endpoint_listener.h"
 
 typedef struct discovery *discovery_pt;
 
-celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context, discovery_pt *discovery);
+celix_status_t discovery_create(bundle_context_pt context, discovery_pt *discovery);
+celix_status_t discovery_destroy(discovery_pt *discovery);
+
+celix_status_t discovery_start(discovery_pt discovery);
 celix_status_t discovery_stop(discovery_pt discovery);
 
 celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt endpoint, char *machtedFilter);
@@ -49,5 +51,7 @@ celix_status_t discovery_endpointListene
 
 celix_status_t discovery_updateEndpointListener(discovery_pt discovery, service_reference_pt reference, endpoint_listener_pt service);
 
+celix_status_t discovery_addDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint);
+celix_status_t discovery_removeDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint);
 
 #endif /* DISCOVERY_H_ */

Added: celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_common.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_common.h?rev=1617689&view=auto
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_common.h (added)
+++ celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_common.h Wed Aug 13 08:46:09 2014
@@ -0,0 +1,65 @@
+/**
+ * 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_descriptor_common.h
+ *
+ * \date		Aug 8, 2014
+ * \author		<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright	Apache License, Version 2.0
+ */
+
+#ifndef ENDPOINT_DESCRIPTOR_COMMON_H_
+#define ENDPOINT_DESCRIPTOR_COMMON_H_
+
+/*
+ * Private constant & enum definitions for endpoint descriptor reader and writer, not needed for normal usage of the reader and writer.
+ */
+
+typedef enum {
+    VALUE_TYPE_STRING,
+    VALUE_TYPE_LONG,
+    VALUE_TYPE_DOUBLE,
+    VALUE_TYPE_FLOAT,
+    VALUE_TYPE_INTEGER,
+    VALUE_TYPE_BYTE,
+    VALUE_TYPE_CHAR,
+    VALUE_TYPE_BOOLEAN,
+    VALUE_TYPE_SHORT,
+} valueType;
+
+
+static valueType valueTypeFromString(char *name);
+static char* valueTypeToString(valueType type);
+
+static const xmlChar* XML = (const xmlChar*) "xml";
+static const xmlChar* XMLNS = (const xmlChar*) "http://www.osgi.org/xmlns/rsa/v1.0.0";
+
+static const xmlChar* ENDPOINT_DESCRIPTIONS = (const xmlChar*) "endpoint-descriptions";
+static const xmlChar* ENDPOINT_DESCRIPTION = (const xmlChar*) "endpoint-description";
+
+static const xmlChar* ARRAY = (const xmlChar*) "array";
+static const xmlChar* LIST = (const xmlChar*) "list";
+static const xmlChar* SET = (const xmlChar*) "set";
+
+static const xmlChar* PROPERTY = (const xmlChar*) "property";
+static const xmlChar* NAME = (const xmlChar*) "name";
+static const xmlChar* VALUE = (const xmlChar*) "value";
+static const xmlChar* VALUE_TYPE = (const xmlChar*) "value-type";
+
+#endif /* ENDPOINT_DESCRIPTOR_COMMON_H_ */

Modified: celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_reader.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_reader.h?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_reader.h (original)
+++ celix/trunk/remote_services/discovery_configured/private/include/endpoint_descriptor_reader.h Wed Aug 13 08:46:09 2014
@@ -33,6 +33,8 @@
 typedef struct endpoint_descriptor_reader *endpoint_descriptor_reader_pt;
 
 celix_status_t endpointDescriptorReader_create(endpoint_descriptor_reader_pt *reader);
+celix_status_t endpointDescriptorReader_destroy(endpoint_descriptor_reader_pt reader);
+
 celix_status_t endpointDescriptorReader_parseDocument(endpoint_descriptor_reader_pt reader, char *document, array_list_pt *endpoints);
 
 

Modified: celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_poller.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_poller.h?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_poller.h (original)
+++ celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_poller.h Wed Aug 13 08:46:09 2014
@@ -1,27 +1,27 @@
 /**
- *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
+ * 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
+ *   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.
+ * 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_discovery_poller.h
  *
- *  \date       3 Jul 2014
- *  \author     <a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
- *  \copyright  Apache License, Version 2.0
+ * \date       3 Jul 2014
+ * \author     <a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright  Apache License, Version 2.0
  */
 
 #ifndef ENDPOINT_DISCOVERY_POLLER_H_
@@ -32,10 +32,11 @@
 
 typedef struct endpoint_discovery_poller *endpoint_discovery_poller_pt;
 
-celix_status_t endpointDiscoveryPoller_create(discovery_pt discovery, endpoint_discovery_poller_pt *poller);
+celix_status_t endpointDiscoveryPoller_create(discovery_pt discovery, bundle_context_pt context, endpoint_discovery_poller_pt *poller);
+celix_status_t endpointDiscoveryPoller_destroy(endpoint_discovery_poller_pt *poller);
+
 celix_status_t endpointDiscoveryPoller_addDiscoveryEndpoint(endpoint_discovery_poller_pt poller, char *url);
 celix_status_t endpointDiscoveryPoller_removeDiscoveryEndpoint(endpoint_discovery_poller_pt poller, char *url);
 
 
-
 #endif /* ENDPOINT_DISCOVERY_POLLER_H_ */

Added: celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_server.h
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_server.h?rev=1617689&view=auto
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_server.h (added)
+++ celix/trunk/remote_services/discovery_configured/private/include/endpoint_discovery_server.h Wed Aug 13 08:46:09 2014
@@ -0,0 +1,71 @@
+/**
+ * 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_discovery_server.h
+ *
+ * \date		Aug 12, 2014
+ * \author		<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright	Apache License, Version 2.0
+ */
+
+#ifndef ENDPOINT_DISCOVERY_SERVER_H_
+#define ENDPOINT_DISCOVERY_SERVER_H_
+
+#include "celix_errno.h"
+#include "discovery.h"
+
+typedef struct endpoint_discovery_server *endpoint_discovery_server_pt;
+
+/**
+ * Creates and starts a new instance of an endpoint discovery server.
+ *
+ * @param discovery [in] the discovery service itself;
+ * @param context [in] the bundle context;
+ * @param server [out] the pointer to the created instance.
+ * @return CELIX_SUCCESS when successful.
+ */
+celix_status_t endpointDiscoveryServer_create(discovery_pt discovery, bundle_context_pt context, endpoint_discovery_server_pt *server);
+
+/**
+ * Stops and destroys a given instance of an endpoint discovery server.
+ *
+ * @param server [out] the pointer to the instance to destroy.
+ * @return CELIX_SUCCESS when successful.
+ */
+celix_status_t endpointDiscoveryServer_destroy(endpoint_discovery_server_pt *server);
+
+/**
+ * Adds a given endpoint description to expose through the given discovery server.
+ *
+ * @param server [in] the endpoint discovery server to expose the endpoint through;
+ * @param endpoint [in] the endpoint description to expose.
+ * @return CELIX_SUCCESS when successful.
+ */
+celix_status_t endpointDiscoveryServer_addEndpoint(endpoint_discovery_server_pt server, endpoint_description_pt endpoint);
+
+/**
+ * Removes a given endpoint description from exposure through the given discovery server.
+ *
+ * @param server [in] the endpoint discovery server to remove the endpoint from;
+ * @param endpoint [in] the endpoint description to remove.
+ * @return CELIX_SUCCESS when successful.
+ */
+celix_status_t endpointDiscoveryServer_removeEndpoint( endpoint_discovery_server_pt server, endpoint_description_pt endpoint);
+
+#endif /* ENDPOINT_DISCOVERY_SERVER_H_ */

Modified: celix/trunk/remote_services/discovery_configured/private/src/discovery.c
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/src/discovery.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/src/discovery.c (original)
+++ celix/trunk/remote_services/discovery_configured/private/src/discovery.c Wed Aug 13 08:46:09 2014
@@ -1,40 +1,37 @@
 /**
- *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
+ * 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
+ *   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.
+ * 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.
  */
 /*
  * discovery.c
  *
- *  \date       Sep 1, 2013
- *  \author    	<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
+ * \date        Aug 8, 2014
+ * \author    	<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright	Apache License, Version 2.0
  */
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdbool.h>
-#include <apr_thread_proc.h>
-#include <apr_strings.h>
 #include <netdb.h>
 #include <netinet/in.h>
 
-#include <dns_sd.h>
-
 #include "constants.h"
+#include "celix_threads.h"
 #include "bundle_context.h"
 #include "array_list.h"
 #include "utils.h"
@@ -46,356 +43,145 @@
 
 #include "discovery.h"
 #include "endpoint_discovery_poller.h"
+#include "endpoint_discovery_server.h"
 
-static const char * const OSGI_DISCOVERY_TYPE = "_osgid._udp";
-static const char * const OSGI_DISCOVERY_NAME = "Amdatu Remote Service Endpoint (Bonjour)";
-static void *APR_THREAD_FUNC discovery_pollDiscovery(apr_thread_t *thd, void *data);
-
-static celix_status_t discovery_start(discovery_pt discovery);
-static void discovery_browseDiscoveryCallback(DNSServiceRef sdRef, DNSServiceFlags flags,
-        uint32_t interfaceIndex, DNSServiceErrorType errorCode,
-        const char *serviceName, const char *regtype, const char *replyDomain,
-        void *context);
-
-
-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_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;
 
+	celix_thread_mutex_t listenerReferencesMutex;
+	celix_thread_mutex_t discoveredServicesMutex;
 
-	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;
-	apr_thread_t *pollDiscovery;
-	DNSServiceRef browseRef;
-	DNSServiceRef browseDiscoveryRef;
-	DNSServiceRef discoveryRef;
+	hash_map_pt listenerReferences; //key=serviceReference, value=nop
+	hash_map_pt discoveredServices; //key=endpointId (string), value=endpoint_description_pt
 
-	char *discoveryPort;
-	char *frameworkUuid;
 	endpoint_discovery_poller_pt poller;
+	endpoint_discovery_server_pt server;
 };
 
-celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context, discovery_pt *discovery) {
+celix_status_t discovery_create(bundle_context_pt context, discovery_pt *discovery) {
 	celix_status_t status = CELIX_SUCCESS;
 
-	*discovery = apr_palloc(pool, sizeof(**discovery));
+	*discovery = malloc(sizeof(struct discovery));
 	if (!*discovery) {
-		status = CELIX_ENOMEM;
-	} else {
-		(*discovery)->context = context;
-		(*discovery)->pool = pool;
-		(*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL);
-		(*discovery)->discoveredServices = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL);
-		(*discovery)->disclosedServices = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL);
-		(*discovery)->running = true;
-		(*discovery)->browseRef = NULL;
-		(*discovery)->discoveryPort = NULL;
-		(*discovery)->listenerReferencesMutex = NULL;
-		(*discovery)->discoveredServicesMutex = NULL;
-		(*discovery)->disclosedServicesMutex = NULL;
-		(*discovery)->frameworkUuid = NULL;
-		(*discovery)->poller = NULL;
-
-		bundleContext_getProperty(context, OSGI_FRAMEWORK_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 = (char *) DEFAULT_DISCOVERY_PORT;
-		} else {
-			(*discovery)->discoveryPort = apr_pstrdup(pool, port);
-		}
-
-		discovery_start(*discovery);
+		return CELIX_ENOMEM;
 	}
 
-	return status;
-}
-
-static celix_status_t discovery_start(discovery_pt discovery) {
-    celix_status_t status = CELIX_SUCCESS;
+	(*discovery)->context = context;
+	(*discovery)->poller = NULL;
+	(*discovery)->server = NULL;
 
-    CELIX_DO_IF(status, status = endpointDiscoveryPoller_create(discovery, &discovery->poller));
+	(*discovery)->listenerReferences = hashMap_create(serviceReference_hashCode, NULL, serviceReference_equals2, NULL);
+	(*discovery)->discoveredServices = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL);
 
-    char *path = NULL;
-    bundleContext_getProperty(discovery->context, "DISCOVERY_PATH", &path);
-    if (path == NULL) {
-        path = "path";
-    }
+	status = celixThreadMutex_create(&(*discovery)->listenerReferencesMutex, NULL);
+	status = celixThreadMutex_create(&(*discovery)->discoveredServicesMutex, NULL);
 
-    TXTRecordRef txtRecord;
-
-    TXTRecordCreate(&txtRecord, 512, NULL);
-    TXTRecordSetValue(&txtRecord, "path", strlen(path), path);
+	return status;
+}
 
-    int port = atoi(discovery->discoveryPort);
-    int portInNetworkByteOrder = ((port << 8) & 0xFF00) | ((port >> 8) & 0xFF); //FIXME assuming little endian
+celix_status_t discovery_start(discovery_pt discovery) {
+    celix_status_t status = CELIX_SUCCESS;
 
-    DNSServiceErrorType error = DNSServiceRegister(&discovery->discoveryRef, 0, 0, OSGI_DISCOVERY_NAME, OSGI_DISCOVERY_TYPE, NULL, NULL, portInNetworkByteOrder,
-            TXTRecordGetLength(&txtRecord), TXTRecordGetBytesPtr(&txtRecord), NULL, NULL);
-    if (error != kDNSServiceErr_NoError) {
-        status = CELIX_ILLEGAL_STATE;
-        printf("============= 11 ERROR %d\n", error);
+    status = endpointDiscoveryPoller_create(discovery, discovery->context, &discovery->poller);
+    if (status != CELIX_SUCCESS) {
+    	return CELIX_BUNDLE_EXCEPTION;
     }
 
-    error = DNSServiceBrowse(&discovery->browseDiscoveryRef, 0, 0, OSGI_DISCOVERY_TYPE, NULL, discovery_browseDiscoveryCallback, discovery);
-    if (error != kDNSServiceErr_NoError) {
-        status = CELIX_ILLEGAL_STATE;
-        printf("============= 22 ERROR %d\n", error);
+    status = endpointDiscoveryServer_create(discovery, discovery->context, &discovery->server);
+    if (status != CELIX_SUCCESS) {
+    	return CELIX_BUNDLE_EXCEPTION;
     }
-    status = CELIX_DO_IF(status, apr_thread_create(&discovery->pollDiscovery, NULL, discovery_pollDiscovery, discovery, discovery->pool));
 
     return status;
 }
 
-static void *APR_THREAD_FUNC discovery_pollDiscovery(apr_thread_t *thd, void *data) {
-    discovery_pt discovery = data;
-
-    while (discovery->running) {
-        DNSServiceProcessResult(discovery->browseDiscoveryRef);
-    }
-    apr_thread_exit(thd, APR_SUCCESS);
+celix_status_t discovery_stop(discovery_pt discovery) {
+	celix_status_t status;
 
-    return NULL;
-}
+	status = endpointDiscoveryServer_destroy(&discovery->server);
+	if (status != CELIX_SUCCESS) {
+		return CELIX_BUNDLE_EXCEPTION;
+	}
 
-static void discovery_browseDiscoveryCallback(DNSServiceRef sdRef, DNSServiceFlags flags,
-        uint32_t interfaceIndex, DNSServiceErrorType errorCode,
-        const char *serviceName, const char *regtype, const char *replyDomain,
-        void *context) {
-    discovery_pt discovery = context;
-    if (flags & kDNSServiceFlagsAdd) {
-        printf("Added discovery with %s %s %s\n", serviceName, regtype, replyDomain);
-        DNSServiceRef resolveRef = NULL;
-        DNSServiceErrorType resolveError = DNSServiceResolve(&resolveRef, 0, 0, serviceName, regtype, replyDomain, discovery_resolveAddCallback, context);
-        printf("Resolve return with error %i\n", resolveError);
-        if (resolveError == kDNSServiceErr_NoError) {
-            DNSServiceProcessResult(resolveRef);
-        } else {
-            //TODO print error / handle error?
-        }
-    } else {
-        printf("Removed discovery 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?
-//        }
-    }
-}
+	status = endpointDiscoveryPoller_destroy(&discovery->poller);
+	if (status != CELIX_SUCCESS) {
+		return CELIX_BUNDLE_EXCEPTION;
+	}
 
-static void discovery_resolveAddCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname,
-        const char *hosttarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context) {
-    discovery_pt discovery = context;
+	hash_map_iterator_pt iter;
 
-    printf("Added discovery with %s %s %s\n", fullname, hosttarget, txtRecord);
+	celixThreadMutex_lock(&discovery->discoveredServicesMutex);
 
-    uint8_t valueLen;
-    char *path = (char *) TXTRecordGetValuePtr(txtLen, txtRecord, "path", &valueLen);
-    char *host = strdup(gethostbyname(hosttarget)->h_name);
-    uint16_t hPort = ntohs(port);
+	iter = hashMapIterator_create(discovery->discoveredServices);
+	while (hashMapIterator_hasNext(iter)) {
+		hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+		endpoint_description_pt endpoint = hashMapEntry_getValue(entry);
 
-    printf("Path: %s, Host: %s\n", path, host);
+		discovery_informEndpointListeners(discovery, endpoint, false);
+	}
+	hashMapIterator_destroy(iter);
 
-    char url[1024];
-    snprintf(url, sizeof(url), "%s:%d/%s", host, hPort, path);
+	celixThreadMutex_unlock(&discovery->discoveredServicesMutex);
 
-    printf("Discovery URL: %s\n", url);
+	return status;
 }
 
-celix_status_t discovery_stop(discovery_pt discovery) {
-	celix_status_t status;
+celix_status_t discovery_destroy(discovery_pt *discovery) {
+	celix_status_t status = CELIX_SUCCESS;
+	hash_map_iterator_pt iter;
 
-	apr_status_t tstat;
-	discovery->running = false;
-	DNSServiceRefDeallocate(discovery->browseRef);
-	apr_status_t stat = apr_thread_join(&tstat, discovery->poll);
-	if (stat != APR_SUCCESS && tstat != APR_SUCCESS) {
-		status = CELIX_BUNDLE_EXCEPTION;
-	}
+	(*discovery)->context = NULL;
+	(*discovery)->poller = NULL;
+	(*discovery)->server = NULL;
 
-	apr_thread_mutex_lock(discovery->disclosedServicesMutex);
-	hash_map_iterator_pt iter = hashMapIterator_create(discovery->disclosedServices);
-	while (hashMapIterator_hasNext(iter)) {
-		hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-		disclosed_endpoint_entry_pt endpointEntry = hashMapEntry_getValue(entry);
-		DNSServiceRefDeallocate(endpointEntry->dnsServiceRef);
-	}
-	hashMapIterator_destroy(iter);
+	celixThreadMutex_lock(&(*discovery)->discoveredServicesMutex);
 
-	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)->discoveredServices, false, false);
+	(*discovery)->discoveredServices = NULL;
 
-	hashMap_destroy(discovery->disclosedServices, false, false);
+	celixThreadMutex_unlock(&(*discovery)->discoveredServicesMutex);
 
-	discovery->disclosedServices = NULL;
-	apr_thread_mutex_unlock(discovery->disclosedServicesMutex);
+	celixThreadMutex_destroy(&(*discovery)->discoveredServicesMutex);
 
-	apr_thread_mutex_lock(discovery->discoveredServicesMutex);
-	hashMap_destroy(discovery->discoveredServices, false, false);
-	discovery->discoveredServices = NULL;
-	apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+	celixThreadMutex_lock(&(*discovery)->listenerReferencesMutex);
 
-	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
-	hashMap_destroy(discovery->listenerReferences, false, false);
-	discovery->listenerReferences = NULL;
-	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
+	hashMap_destroy((*discovery)->listenerReferences, false, false);
+	(*discovery)->listenerReferences = NULL;
+
+	celixThreadMutex_unlock(&(*discovery)->listenerReferencesMutex);
+
+	celixThreadMutex_destroy(&(*discovery)->listenerReferencesMutex);
+
+	free(*discovery);
 
 	return status;
 }
 
-celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt endpoint, char *machtedFilter) {
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt endpoint, char *matchedFilter) {
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
-	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;
-		}
-	}
-
-	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("DISCOVERY_CONFIGURED: Endpoint for %s, with filter \"%s\" added...\n", endpoint->service, matchedFilter);
 
+	status = endpointDiscoveryServer_addEndpoint(discovery->server, endpoint);
 
 	return status;
 }
 
-celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt endpoint, char *machtedFilter) {
+celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt endpoint, char *matchedFilter) {
 	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);
+	printf("DISCOVERY_CONFIGURED: Endpoint for %s, with filter \"%s\" removed...\n", endpoint->service, matchedFilter);
 
+	status = endpointDiscoveryServer_removeEndpoint(discovery->server, endpoint);
 
 	return status;
 }
 
-celix_status_t discovery_endpointListenerAdding(void * handle, service_reference_pt reference, void **service) {
+celix_status_t discovery_endpointListenerAdding(void* handle, service_reference_pt reference, void** service) {
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
@@ -404,48 +190,52 @@ celix_status_t discovery_endpointListene
 	return status;
 }
 
-celix_status_t discovery_endpointListenerAdded(void * handle, service_reference_pt reference, void * service) {
+celix_status_t discovery_endpointListenerAdded(void* handle, service_reference_pt reference, void* service) {
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
 	service_registration_pt registration = NULL;
 	serviceReference_getServiceRegistration(reference, &registration);
+
 	properties_pt serviceProperties = NULL;
 	serviceRegistration_getProperties(registration, &serviceProperties);
+
 	char *discoveryListener = properties_get(serviceProperties, "DISCOVERY");
+	char *scope = properties_get(serviceProperties, (char *) OSGI_ENDPOINT_LISTENER_SCOPE);
+	filter_pt filter = filter_create(scope);
 
 	if (discoveryListener != NULL && strcmp(discoveryListener, "true") == 0) {
 		printf("DISCOVERY: EndpointListener Ignored - Discovery listener\n");
 	} else {
-		printf("DISCOVERY: EndpointListener Added - Add Scope\n");
+		celixThreadMutex_lock(&discovery->discoveredServicesMutex);
 
-		apr_thread_mutex_lock(discovery->discoveredServicesMutex);
-		if (discovery->discoveredServices != NULL) {
-			hash_map_iterator_pt iter = hashMapIterator_create(discovery->discoveredServices);
-			while (hashMapIterator_hasNext(iter)) {
-				endpoint_description_pt endpoint = hashMapIterator_nextKey(iter);
+		hash_map_iterator_pt iter = hashMapIterator_create(discovery->discoveredServices);
+		while (hashMapIterator_hasNext(iter)) {
+			endpoint_description_pt endpoint = hashMapIterator_nextKey(iter);
+
+			bool matchResult = false;
+			filter_match(filter, endpoint->properties, &matchResult);
+			if (matchResult) {
 				endpoint_listener_pt listener = service;
 
-				char *scope = properties_get(serviceProperties,
-				(char *) OSGI_ENDPOINT_LISTENER_SCOPE);
-				filter_pt filter = filter_create(scope); //FIXME memory leak
-				bool matchResult = false;
-				filter_match(filter, endpoint->properties, &matchResult);
-				if (matchResult) {
-					listener->endpointAdded(listener, endpoint, NULL);
-				}
+				printf("DISCOVERY: EndpointListener Added - Add Scope\n");
+
+				listener->endpointAdded(listener, endpoint, NULL);
 			}
-			hashMapIterator_destroy(iter);
 		}
-		apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+		hashMapIterator_destroy(iter);
 
-		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);
+		celixThreadMutex_unlock(&discovery->discoveredServicesMutex);
+
+		celixThreadMutex_lock(&discovery->listenerReferencesMutex);
+
+		hashMap_put(discovery->listenerReferences, reference, NULL);
+
+		celixThreadMutex_unlock(&discovery->listenerReferencesMutex);
 	}
 
+	filter_destroy(filter);
+
 	return status;
 }
 
@@ -453,64 +243,109 @@ celix_status_t discovery_endpointListene
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
-//	printf("DISCOVERY: EndpointListener Modified - Update Scope TODO\n");
+	status = discovery_endpointListenerRemoved(handle, reference, service);
+	status = discovery_endpointListenerAdded(handle, reference, service);
 
 	return status;
 }
 
-
-
 celix_status_t discovery_endpointListenerRemoved(void * handle, service_reference_pt reference, void * service) {
 	celix_status_t status = CELIX_SUCCESS;
 	discovery_pt discovery = handle;
 
-	printf("DISCOVERY: EndpointListener Removed\n");
-	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+	status = celixThreadMutex_lock(&discovery->listenerReferencesMutex);
+
 	if (discovery->listenerReferences != NULL) {
-		hashMap_remove(discovery->listenerReferences, reference);
+		if (hashMap_remove(discovery->listenerReferences, reference)) {
+			printf("DISCOVERY: EndpointListener Removed\n");
+		}
 	}
-	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
+
+	status = celixThreadMutex_unlock(&discovery->listenerReferencesMutex);
 
 	return status;
 }
 
-
 static celix_status_t discovery_informEndpointListeners(discovery_pt discovery, endpoint_description_pt endpoint, bool endpointAdded) {
 	celix_status_t status = CELIX_SUCCESS;
 
 	// Inform listeners of new endpoint
-	apr_thread_mutex_lock(discovery->listenerReferencesMutex);
+	status = celixThreadMutex_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 *) OSGI_ENDPOINT_LISTENER_SCOPE);
+			char *scope = properties_get(serviceProperties, (char *) OSGI_ENDPOINT_LISTENER_SCOPE);
+
 			filter_pt filter = filter_create(scope);
 			bool matchResult = false;
-			filter_match(filter, endpoint->properties, &matchResult);
+
+			status = filter_match(filter, endpoint->properties, &matchResult);
 			if (matchResult) {
-				printf("DISCOVERY: Add service (%s)\n", endpoint->service);
-				bundleContext_getService(discovery->context, reference,
-						(void**) &listener);
+				bundleContext_getService(discovery->context, reference, (void**) &listener);
 				if (endpointAdded) {
-					listener->endpointAdded(listener->handle, endpoint, NULL );
+					printf("DISCOVERY_CONFIGURED: Adding service (%s)\n", endpoint->service);
+
+					listener->endpointAdded(listener->handle, endpoint, scope);
 				} else {
-					listener->endpointRemoved(listener->handle, endpoint, NULL );
-				}
+					printf("DISCOVERY_CONFIGURED: Removing service (%s)\n", endpoint->service);
 
+					listener->endpointRemoved(listener->handle, endpoint, scope);
+				}
 			}
 		}
 		hashMapIterator_destroy(iter);
 	}
-	apr_thread_mutex_unlock(discovery->listenerReferencesMutex);
+
+	status = celixThreadMutex_unlock(&discovery->listenerReferencesMutex);
+
+	return status;
+}
+
+celix_status_t discovery_addDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	status = celixThreadMutex_lock(&discovery->discoveredServicesMutex);
+
+	char* endpointId = endpoint->id;
+	bool exists = hashMap_get(discovery->discoveredServices, endpointId) != NULL;
+	if (!exists) {
+		hashMap_put(discovery->discoveredServices, endpointId, endpoint);
+	}
+
+	status = celixThreadMutex_unlock(&discovery->discoveredServicesMutex);
+
+	if (!exists) {
+		// notify our listeners that a new endpoint is available...
+		discovery_informEndpointListeners(discovery, endpoint, true /* addingService */);
+	}
+
+	return status;
+}
+
+celix_status_t discovery_removeDiscoveredEndpoint(discovery_pt discovery, endpoint_description_pt endpoint) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	status = celixThreadMutex_lock(&discovery->discoveredServicesMutex);
+
+	char* endpointId = endpoint->id;
+	void* oldValue = hashMap_remove(discovery->discoveredServices, endpointId);
+
+	status = celixThreadMutex_unlock(&discovery->discoveredServicesMutex);
+
+	if (oldValue) {
+		status = discovery_informEndpointListeners(discovery, endpoint, false /* addingService */);
+	}
 
 	return status;
 }

Modified: celix/trunk/remote_services/discovery_configured/private/src/discovery_activator.c
URL: http://svn.apache.org/viewvc/celix/trunk/remote_services/discovery_configured/private/src/discovery_activator.c?rev=1617689&r1=1617688&r2=1617689&view=diff
==============================================================================
--- celix/trunk/remote_services/discovery_configured/private/src/discovery_activator.c (original)
+++ celix/trunk/remote_services/discovery_configured/private/src/discovery_activator.c Wed Aug 13 08:46:09 2014
@@ -1,35 +1,32 @@
 /**
- *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
+ * 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
+ *   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.
+ * 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.
  */
 /*
- * dependency_activator.c
+ * discovery_activator.c
  *
- *  \date       Sep 29, 2011
- *  \author    	<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
+ * \date        Aug 8, 2014
+ * \author    	<a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright	Apache License, Version 2.0
  */
 
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <apr_strings.h>
-#include <apr_uuid.h>
-
 #include "bundle_activator.h"
 #include "service_tracker.h"
 #include "service_registration.h"
@@ -40,64 +37,49 @@
 #include "remote_constants.h"
 
 struct activator {
-	apr_pool_t *pool;
 	bundle_context_pt context;
-
 	discovery_pt discovery;
 
 	service_tracker_pt endpointListenerTracker;
 	service_registration_pt endpointListenerService;
 };
 
-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_createEPLTracker(struct activator *activator, service_tracker_pt *tracker) {
 	celix_status_t status = CELIX_SUCCESS;
-	apr_pool_t *parentPool = NULL;
-	apr_pool_t *pool = NULL;
-	struct activator *activator = NULL;
-
-	bundleContext_getMemoryPool(context, &parentPool);
-	apr_pool_create(&pool, parentPool);
-	activator = apr_palloc(pool, sizeof(*activator));
-	if (!activator) {
-		status = CELIX_ENOMEM;
-	} else {
-		activator->pool = pool;
-		activator->context = context;
-		activator->endpointListenerTracker = NULL;
-		activator->endpointListenerService = NULL;
 
-		discovery_create(pool, context, &activator->discovery);
+	service_tracker_customizer_pt customizer = NULL;
 
-		discoveryActivator_createEPLTracker(activator,
-				&activator->endpointListenerTracker);
+	status = serviceTrackerCustomizer_create(activator->discovery,
+			discovery_endpointListenerAdding, discovery_endpointListenerAdded, discovery_endpointListenerModified, discovery_endpointListenerRemoved,
+			&customizer);
 
-		*userData = activator;
+	if (status == CELIX_SUCCESS) {
+		status = serviceTracker_create(activator->context, (char *) OSGI_ENDPOINT_LISTENER_SERVICE, customizer, tracker);
 	}
 
 	return status;
 }
 
-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 status = CELIX_SUCCESS;
 
-	service_tracker_customizer_pt customizer = NULL;
+	struct activator* activator = malloc(sizeof(struct activator));
+	if (!activator) {
+		return CELIX_ENOMEM;
+	}
 
-	status = serviceTrackerCustomizer_create(
-			activator->discovery, discovery_endpointListenerAdding,
-			discovery_endpointListenerAdded, discovery_endpointListenerModified,
-			discovery_endpointListenerRemoved, &customizer);
+	status = discovery_create(context, &activator->discovery);
+	if (status != CELIX_SUCCESS) {
+		return status;
+	}
 
-	if (status == CELIX_SUCCESS) {
-		status = serviceTracker_create(activator->context,
-				(char *) OSGI_ENDPOINT_LISTENER_SERVICE, customizer, tracker);
+	activator->context = context;
+	activator->endpointListenerTracker = NULL;
+	activator->endpointListenerService = NULL;
 
-		serviceTracker_open(activator->endpointListenerTracker);
-	}
+	status = bundleActivator_createEPLTracker(activator, &activator->endpointListenerTracker);
+
+	*userData = activator;
 
 	return status;
 }
@@ -105,25 +87,47 @@ celix_status_t discoveryActivator_create
 celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
 	celix_status_t status = CELIX_SUCCESS;
 	struct activator *activator = userData;
-	apr_pool_t *pool = NULL;
-	apr_pool_create(&pool, activator->pool);
 
-	endpoint_listener_pt endpointListener = apr_palloc(pool,
-			sizeof(*endpointListener));
+	char *uuid = NULL;
+	status = bundleContext_getProperty(context, OSGI_FRAMEWORK_FRAMEWORK_UUID, &uuid);
+	if (!uuid) {
+		printf("DISCOVERY_CONFIGURED: no framework UUID defined?!\n");
+		return CELIX_ILLEGAL_STATE;
+	}
+
+	size_t len = 11 + strlen(OSGI_FRAMEWORK_OBJECTCLASS) + strlen(OSGI_RSA_ENDPOINT_FRAMEWORK_UUID) + strlen(uuid);
+	char *scope = malloc(len);
+	if (!scope) {
+		return CELIX_ENOMEM;
+	}
+
+	sprintf(scope, "(&(%s=*)(%s=%s))", OSGI_FRAMEWORK_OBJECTCLASS, OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, uuid);
+	scope[len] = 0;
+
+	printf("DISCOVERY_CONFIGURED: using scope %s.\n", scope);
+
+	endpoint_listener_pt endpointListener = malloc(sizeof(struct endpoint_listener));
+	if (!endpointListener) {
+		return CELIX_ENOMEM;
+	}
+
 	endpointListener->handle = activator->discovery;
 	endpointListener->endpointAdded = discovery_endpointAdded;
 	endpointListener->endpointRemoved = discovery_endpointRemoved;
 
 	properties_pt props = properties_create();
 	properties_set(props, "DISCOVERY", "true");
-	char *uuid = NULL;
-	bundleContext_getProperty(context, OSGI_FRAMEWORK_FRAMEWORK_UUID, &uuid);
-	char *scope = apr_pstrcat(activator->pool, "(&(", OSGI_FRAMEWORK_OBJECTCLASS, "=*)(", OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, "=", uuid, "))", NULL);
-	printf("DISCOVERY SCOPE IS: %s\n", scope);
 	properties_set(props, (char *) OSGI_ENDPOINT_LISTENER_SCOPE, scope);
-	status = bundleContext_registerService(context,
-			(char *) OSGI_ENDPOINT_LISTENER_SERVICE, endpointListener, props,
-			&activator->endpointListenerService);
+
+	status = bundleContext_registerService(context, (char *) OSGI_ENDPOINT_LISTENER_SERVICE, endpointListener, props, &activator->endpointListenerService);
+
+	if (status == CELIX_SUCCESS) {
+		status = serviceTracker_open(activator->endpointListenerTracker);
+	}
+
+	if (status == CELIX_SUCCESS) {
+		status = discovery_start(activator->discovery);
+	}
 
 	return status;
 }
@@ -132,15 +136,29 @@ celix_status_t bundleActivator_stop(void
 	celix_status_t status = CELIX_SUCCESS;
 	struct activator *activator = userData;
 
-	serviceTracker_close(activator->endpointListenerTracker);
-	serviceRegistration_unregister(activator->endpointListenerService);
-	discovery_stop(activator->discovery);
+	status = serviceTracker_close(activator->endpointListenerTracker);
+
+	status = serviceRegistration_unregister(activator->endpointListenerService);
+
+	status = discovery_stop(activator->discovery);
 
 	return status;
 }
 
-celix_status_t bundleActivator_destroy(void * userData,
-		bundle_context_pt context) {
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
 	celix_status_t status = CELIX_SUCCESS;
+	struct activator *activator = userData;
+
+	status = serviceTracker_destroy(activator->endpointListenerTracker);
+
+	status = serviceRegistration_destroy(activator->endpointListenerService);
+
+	status = discovery_destroy(activator->discovery);
+
+	activator->endpointListenerTracker = NULL;
+	activator->endpointListenerService = NULL;
+	activator->discovery = NULL;
+	activator->context = NULL;
+
 	return status;
 }