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, ®istration);
+ 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;
-}