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 2011/11/07 19:06:26 UTC
svn commit: r1198847 [2/2] - in /incubator/celix/trunk: cmake/ framework/
framework/private/include/ framework/private/src/ framework/public/include/
launcher/ log_writer/ remote_services/ remote_services/calc_shell/MANIFEST/
remote_services/discovery/...
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=1198847&r1=1198846&r2=1198847&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 Nov 7 18:06:25 2011
@@ -7,6 +7,9 @@
#include <stdio.h>
#include <stdlib.h>
+#include <apr_uuid.h>
+#include <apr_strings.h>
+
#include "headers.h"
#include "topology_manager.h"
#include "bundle_context.h"
@@ -15,6 +18,9 @@
#include "bundle.h"
#include "remote_service_admin.h"
#include "remote_constants.h"
+#include "filter.h"
+#include "listener_hook_service.h"
+#include "utils.h"
struct topology_manager {
apr_pool_t *pool;
@@ -22,9 +28,20 @@ struct topology_manager {
ARRAY_LIST rsaList;
HASH_MAP exportedServices;
+ HASH_MAP importedServices;
+
+ HASH_MAP importInterests;
+};
+
+struct import_interest {
+ char *filter;
+ int refs;
};
celix_status_t topologyManager_notifyListeners(topology_manager_t manager, remote_service_admin_service_t rsa, ARRAY_LIST registrations);
+celix_status_t topologyManager_notifyListenersOfRemoval(topology_manager_t manager, remote_service_admin_service_t rsa, export_registration_t export);
+
+celix_status_t topologyManager_getUUID(topology_manager_t manager, char **uuidStr);
celix_status_t topologyManager_create(BUNDLE_CONTEXT context, apr_pool_t *pool, topology_manager_t *manager) {
celix_status_t status = CELIX_SUCCESS;
@@ -37,6 +54,8 @@ celix_status_t topologyManager_create(BU
(*manager)->context = context;
(*manager)->rsaList = arrayList_create();
(*manager)->exportedServices = hashMap_create(NULL, NULL, NULL, NULL);
+ (*manager)->importedServices = hashMap_create(NULL, NULL, NULL, NULL);
+ (*manager)->importInterests = hashMap_create(string_hash, NULL, string_equals, NULL);
}
return status;
@@ -46,7 +65,7 @@ celix_status_t topologyManager_rsaAdding
celix_status_t status = CELIX_SUCCESS;
topology_manager_t manager = handle;
- bundleContext_getService(manager->context, reference, service);
+ status = bundleContext_getService(manager->context, reference, service);
return status;
}
@@ -88,11 +107,13 @@ celix_status_t topologyManager_serviceCh
if (event->type == REGISTERED) {
if (export != NULL) {
printf("TOPOLOGY_MANAGER: Service registered: %s\n", name);
- topologyManager_exportService(manager, event->reference);
+ status = topologyManager_exportService(manager, event->reference);
}
} else if (event->type == UNREGISTERING) {
- printf("TOPOLOGY_MANAGER: Service unregistering: %s\n", name);
- topologyManager_removeService(manager, event->reference);
+ //if (export != NULL) {
+ printf("TOPOLOGY_MANAGER: Service unregistering: %s\n", name);
+ status = topologyManager_removeService(manager, event->reference);
+ //}
}
return status;
@@ -103,7 +124,7 @@ celix_status_t topologyManager_endpointA
topology_manager_t manager = handle;
printf("TOPOLOGY_MANAGER: Endpoint added\n");
- topologyManager_importService(manager, endpoint);
+ status = topologyManager_importService(manager, endpoint);
return status;
@@ -111,6 +132,20 @@ celix_status_t topologyManager_endpointA
celix_status_t topologyManager_endpointRemoved(void *handle, endpoint_description_t endpoint, char *machtedFilter) {
celix_status_t status = CELIX_SUCCESS;
+ topology_manager_t manager = handle;
+ printf("TOPOLOGY_MANAGER: Endpoint removed\n");
+
+ if (hashMap_containsKey(manager->importedServices, endpoint)) {
+ HASH_MAP imports = hashMap_get(manager->importedServices, endpoint);
+ HASH_MAP_ITERATOR iter = hashMapIterator_create(imports);
+ while (hashMapIterator_hasNext(iter)) {
+ HASH_MAP_ENTRY entry = hashMapIterator_nextEntry(iter);
+ remote_service_admin_service_t rsa = hashMapEntry_getKey(entry);
+ import_registration_t import = hashMapEntry_getValue(entry);
+ rsa->importRegistration_close(import);
+ }
+ }
+
return status;
}
@@ -121,8 +156,15 @@ celix_status_t topologyManager_exportSer
hashMap_put(manager->exportedServices, reference, exports);
if (arrayList_size(manager->rsaList) == 0) {
- char *symbolicName = module_getSymbolicName(bundle_getCurrentModule(reference->bundle));
- printf("TOPOLOGY_MANAGER: No RemoteServiceAdmin available, unable to export service from bundle %s.\n", symbolicName);
+ char *symbolicName = NULL;
+ MODULE module = NULL;
+ status = bundle_getCurrentModule(reference->bundle, &module);
+ if (status == CELIX_SUCCESS) {
+ status = module_getSymbolicName(module, &symbolicName);
+ if (status == CELIX_SUCCESS) {
+ printf("TOPOLOGY_MANAGER: No RemoteServiceAdmin available, unable to export service from bundle %s.\n", symbolicName);
+ }
+ }
} else {
int size = arrayList_size(manager->rsaList);
int iter = 0;
@@ -130,9 +172,11 @@ celix_status_t topologyManager_exportSer
remote_service_admin_service_t rsa = arrayList_get(manager->rsaList, iter);
ARRAY_LIST endpoints = NULL;
- rsa->exportService(rsa->admin, reference, NULL, &endpoints);
- hashMap_put(exports, rsa, endpoints);
- topologyManager_notifyListeners(manager, rsa, endpoints);
+ status = rsa->exportService(rsa->admin, reference, NULL, &endpoints);
+ if (status == CELIX_SUCCESS) {
+ hashMap_put(exports, rsa, endpoints);
+ status = topologyManager_notifyListeners(manager, rsa, endpoints);
+ }
}
}
@@ -149,6 +193,8 @@ celix_status_t topologyManager_notifyLis
int eplIt;
for (eplIt = 0; eplIt < arrayList_size(endpointListeners); eplIt++) {
SERVICE_REFERENCE eplRef = arrayList_get(endpointListeners, eplIt);
+ char *scope = properties_get(eplRef->registration->properties, (char *) ENDPOINT_LISTENER_SCOPE);
+ FILTER filter = filter_create(scope);
endpoint_listener_t epl = NULL;
status = bundleContext_getService(manager->context, eplRef, (void **) &epl);
if (status == CELIX_SUCCESS) {
@@ -157,9 +203,15 @@ celix_status_t topologyManager_notifyLis
export_registration_t export = arrayList_get(registrations, regIt);
export_reference_t reference = NULL;
endpoint_description_t endpoint = NULL;
- rsa->exportRegistration_getExportReference(export, &reference);
- rsa->exportReference_getExportedEndpoint(reference, &endpoint);
- status = epl->endpointAdded(epl->handle, endpoint, NULL);
+ status = rsa->exportRegistration_getExportReference(export, &reference);
+ if (status == CELIX_SUCCESS) {
+ status = rsa->exportReference_getExportedEndpoint(reference, &endpoint);
+ if (status == CELIX_SUCCESS) {
+ if (filter_match(filter, endpoint->properties)) {
+ status = epl->endpointAdded(epl->handle, endpoint, scope);
+ }
+ }
+ }
}
}
}
@@ -171,9 +223,9 @@ celix_status_t topologyManager_notifyLis
celix_status_t topologyManager_importService(topology_manager_t manager, endpoint_description_t endpoint) {
celix_status_t status = CELIX_SUCCESS;
- HASH_MAP exports = hashMap_create(NULL, NULL, NULL, NULL);
+ HASH_MAP imports = hashMap_create(NULL, NULL, NULL, NULL);
- //hashMap_put(manager->exportedServices, reference, exports);
+ hashMap_put(manager->importedServices, endpoint, imports);
if (arrayList_size(manager->rsaList) == 0) {
printf("TOPOLOGY_MANAGER: No RemoteServiceAdmin available, unable to import service %s.\n", endpoint->service);
@@ -184,8 +236,8 @@ celix_status_t topologyManager_importSer
remote_service_admin_service_t rsa = arrayList_get(manager->rsaList, iter);
import_registration_t import = NULL;
- rsa->importService(rsa->admin, endpoint, &import);
- //hashMap_put(exports, rsa, endpoints);
+ status = rsa->importService(rsa->admin, endpoint, &import);
+ hashMap_put(imports, rsa, import);
}
}
@@ -198,5 +250,155 @@ celix_status_t topologyManager_removeSer
printf("TOPOLOGY_MANAGER: Remove Service: %s.\n", name);
+ if (hashMap_containsKey(manager->exportedServices, reference)) {
+ HASH_MAP exports = hashMap_get(manager->exportedServices, reference);
+ HASH_MAP_ITERATOR iter = hashMapIterator_create(exports);
+ while (hashMapIterator_hasNext(iter)) {
+ HASH_MAP_ENTRY entry = hashMapIterator_nextEntry(iter);
+ remote_service_admin_service_t rsa = hashMapEntry_getKey(entry);
+ ARRAY_LIST exports = hashMapEntry_getValue(entry);
+ int exportsIter = 0;
+ for (exportsIter = 0; exportsIter < arrayList_size(exports); exportsIter++) {
+ export_registration_t export = arrayList_get(exports, exportsIter);
+ rsa->exportRegistration_close(export);
+ topologyManager_notifyListenersOfRemoval(manager, rsa, export);
+ }
+
+ }
+ }
+
+ return status;
+}
+
+celix_status_t topologyManager_notifyListenersOfRemoval(topology_manager_t manager, remote_service_admin_service_t rsa, export_registration_t export) {
+ celix_status_t status = CELIX_SUCCESS;
+ ARRAY_LIST endpointListeners = NULL;
+
+ status = bundleContext_getServiceReferences(manager->context, endpoint_listener_service, NULL, &endpointListeners);
+ if (status == CELIX_SUCCESS) {
+ if (endpointListeners != NULL) {
+ int eplIt;
+ for (eplIt = 0; eplIt < arrayList_size(endpointListeners); eplIt++) {
+ SERVICE_REFERENCE eplRef = arrayList_get(endpointListeners, eplIt);
+ endpoint_listener_t epl = NULL;
+ status = bundleContext_getService(manager->context, eplRef, (void **) &epl);
+ if (status == CELIX_SUCCESS) {
+ export_reference_t reference = NULL;
+ endpoint_description_t endpoint = NULL;
+ status = rsa->exportRegistration_getExportReference(export, &reference);
+ if (status == CELIX_SUCCESS) {
+ status = rsa->exportReference_getExportedEndpoint(reference, &endpoint);
+ if (status == CELIX_SUCCESS) {
+ status = epl->endpointRemoved(epl->handle, endpoint, NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return status;
+}
+
+celix_status_t topologyManager_extendFilter(topology_manager_t manager, char *filter, char **updatedFilter) {
+ celix_status_t status = CELIX_SUCCESS;
+ apr_pool_t *pool = NULL;
+ apr_pool_create(&pool, manager->pool);
+
+ char *uuid = NULL;
+ topologyManager_getUUID(manager, &uuid);
+ *updatedFilter = apr_pstrcat(pool, "(&", filter, "(!(", ENDPOINT_FRAMEWORK_UUID, "=", uuid, ")))", NULL);
+
+ return status;
+}
+
+celix_status_t topologyManager_listenerAdded(void *handle, ARRAY_LIST listeners) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ topology_manager_t manager = handle;
+ int i;
+ for (i = 0; i < arrayList_size(listeners); i++) {
+ listener_hook_info_t info = arrayList_get(listeners, i);
+ printf("TOPOLOGY_MANAGER: listener with filter \"%s\" added\n", info->filter);
+
+ BUNDLE bundle, self;
+ bundleContext_getBundle(info->context, &bundle);
+ bundleContext_getBundle(manager->context, &self);
+ if (bundle == self) {
+ printf("TOPOLOGY_MANAGER: Ignore myself\n");
+ continue;
+ }
+
+ char *filter;
+ topologyManager_extendFilter(manager, info->filter, &filter);
+
+ struct import_interest *interest = hashMap_get(manager->importInterests, filter);
+ if (interest != NULL) {
+ interest->refs++;
+ } else {
+ apr_pool_t *pool = NULL;
+ apr_pool_create(&pool, manager->pool);
+ interest = apr_palloc(pool, sizeof(*interest));
+ interest->filter = filter;
+ interest->refs = 1;
+ hashMap_put(manager->importInterests, filter, interest);
+// endpointListener.extendScope(exFilter);
+ }
+ }
+
+ return status;
+}
+
+celix_status_t topologyManager_listenerRemoved(void *handle, ARRAY_LIST listeners) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ topology_manager_t manager = handle;
+ int i;
+ for (i = 0; i < arrayList_size(listeners); i++) {
+ listener_hook_info_t info = arrayList_get(listeners, i);
+ printf("TOPOLOGY_MANAGER: listener with filter \"%s\" removed\n", info->filter);
+
+ char *filter;
+ topologyManager_extendFilter(manager, info->filter, &filter);
+
+ struct import_interest *interest = hashMap_get(manager->importInterests, filter);
+ if (interest != NULL) {
+ if (interest->refs-- <= 0) {
+ // last reference, remove from scope
+// endpointListener.reduceScope(exFilter);
+ hashMap_remove(manager->importInterests, filter);
+
+ // clean up import registrations
+// List<ImportRegistration> irs = importedServices.remove(exFilter);
+// if (irs != null) {
+// for (ImportRegistration ir : irs) {
+// if (ir != null) {
+// ir.close();
+// }
+// }
+// }
+ }
+ }
+ }
+
+ return status;
+}
+
+celix_status_t topologyManager_getUUID(topology_manager_t 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;
}
Modified: incubator/celix/trunk/shell/inspect_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/inspect_command.c?rev=1198847&r1=1198846&r2=1198847&view=diff
==============================================================================
--- incubator/celix/trunk/shell/inspect_command.c (original)
+++ incubator/celix/trunk/shell/inspect_command.c Mon Nov 7 18:06:25 2011
@@ -110,28 +110,34 @@ celix_status_t inspectCommand_printExpor
ARRAY_LIST refs = NULL;
if (bundle_getRegisteredServices(bundle, &refs) == CELIX_SUCCESS) {
char line[256];
- char * name = module_getSymbolicName(bundle_getCurrentModule(bundle));
- sprintf(line, "%s provides services:\n", name);
- out(line);
- out("==============\n");
-
- if (refs == NULL || arrayList_size(refs) == 0) {
- out("Nothing\n");
- } else {
- int j = 0;
- for (j = 0; j < arrayList_size(refs); j++) {
- SERVICE_REFERENCE ref = arrayList_get(refs, j);
- char line[256];
- char *objectClass = properties_get(ref->registration->properties, (char *) OBJECTCLASS);
- sprintf(line, "ObjectClass = %s\n", objectClass);
+ MODULE module = NULL;
+ char * name = NULL;
+ status = bundle_getCurrentModule(bundle, &module);
+ if (status == CELIX_SUCCESS) {
+ status = module_getSymbolicName(module, &name);
+ if (status == CELIX_SUCCESS) {
+ sprintf(line, "%s provides services:\n", name);
out(line);
- if ((j + 1) < arrayList_size(refs)) {
- out("----\n");
+ out("==============\n");
+
+ if (refs == NULL || arrayList_size(refs) == 0) {
+ out("Nothing\n");
+ } else {
+ int j = 0;
+ for (j = 0; j < arrayList_size(refs); j++) {
+ SERVICE_REFERENCE ref = arrayList_get(refs, j);
+ char line[256];
+ char *objectClass = properties_get(ref->registration->properties, (char *) OBJECTCLASS);
+ sprintf(line, "ObjectClass = %s\n", objectClass);
+ out(line);
+ if ((j + 1) < arrayList_size(refs)) {
+ out("----\n");
+ }
+ }
}
}
}
}
-
}
}
}
Modified: incubator/celix/trunk/shell/ps_command.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/shell/ps_command.c?rev=1198847&r1=1198846&r2=1198847&view=diff
==============================================================================
--- incubator/celix/trunk/shell/ps_command.c (original)
+++ incubator/celix/trunk/shell/ps_command.c Mon Nov 7 18:06:25 2011
@@ -87,11 +87,14 @@ void psCommand_execute(COMMAND command,
BUNDLE_STATE state;
bundle_getState(bundle, &state);
char * stateString = psCommand_stateString(state);
- char * name = module_getSymbolicName(bundle_getCurrentModule(bundle));
+ MODULE module = NULL;
+ char * name = NULL;
+ bundle_getCurrentModule(bundle, &module);
+ module_getSymbolicName(module, &name);
if (showLocation) {
bundleArchive_getLocation(bundle_getArchive(bundle), &name);
} else if (showSymbolicName) {
- name = module_getSymbolicName(bundle_getCurrentModule(bundle));
+ // do nothing
} else if (showUpdateLocation) {
bundleArchive_getLocation(bundle_getArchive(bundle), &name);
}