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/08/30 15:56:41 UTC

svn commit: r1163212 - in /incubator/celix/trunk: dependency_manager/ examples/whiteboard/publisherA/ examples/whiteboard/publisherB/ examples/whiteboard/tracker_depman/ framework/private/include/ framework/private/src/

Author: abroekhuis
Date: Tue Aug 30 13:56:41 2011
New Revision: 1163212

URL: http://svn.apache.org/viewvc?rev=1163212&view=rev
Log:
Added filter support to the dependency manager

Modified:
    incubator/celix/trunk/dependency_manager/service_dependency.c
    incubator/celix/trunk/dependency_manager/service_dependency.h
    incubator/celix/trunk/examples/whiteboard/publisherA/activator.c
    incubator/celix/trunk/examples/whiteboard/publisherB/activator.c
    incubator/celix/trunk/examples/whiteboard/tracker_depman/dependency_activator.c
    incubator/celix/trunk/framework/private/include/service_tracker.h
    incubator/celix/trunk/framework/private/src/service_tracker.c

Modified: incubator/celix/trunk/dependency_manager/service_dependency.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/dependency_manager/service_dependency.c?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/dependency_manager/service_dependency.c (original)
+++ incubator/celix/trunk/dependency_manager/service_dependency.c Tue Aug 30 13:56:41 2011
@@ -28,6 +28,7 @@
 #include "service_dependency.h"
 #include "service_tracker.h"
 #include "bundle_context.h"
+#include "constants.h"
 
 void * serviceDependency_addingService(void * handle, SERVICE_REFERENCE reference);
 void serviceDependency_addedService(void * handle, SERVICE_REFERENCE reference, void * service);
@@ -41,6 +42,7 @@ SERVICE_DEPENDENCY serviceDependency_cre
 	dependency->autoConfigureField = NULL;
 	dependency->tracker = NULL;
 	dependency->trackedServiceName = NULL;
+	dependency->trackedServiceFilter = NULL;
 	dependency->service = NULL;
 	dependency->serviceInstance = NULL;
 	dependency->reference = NULL;
@@ -68,15 +70,18 @@ void * serviceDependency_getService(SERV
 void serviceDependency_start(SERVICE_DEPENDENCY dependency, SERVICE service) {
 	dependency->service = service;
 
-	if (dependency->trackedServiceName != NULL) {
-		SERVICE_TRACKER_CUSTOMIZER cust = (SERVICE_TRACKER_CUSTOMIZER) malloc(sizeof(*cust));
-		cust->handle = dependency;
-		cust->addingService = serviceDependency_addingService;
-		cust->addedService = serviceDependency_addedService;
-		cust->modifiedService = serviceDependency_modifiedService;
-		cust->removedService = serviceDependency_removedService;
+	SERVICE_TRACKER_CUSTOMIZER cust = (SERVICE_TRACKER_CUSTOMIZER) malloc(sizeof(*cust));
+	cust->handle = dependency;
+	cust->addingService = serviceDependency_addingService;
+	cust->addedService = serviceDependency_addedService;
+	cust->modifiedService = serviceDependency_modifiedService;
+	cust->removedService = serviceDependency_removedService;
 
-		dependency->tracker = NULL;
+	dependency->tracker = NULL;
+
+	if (dependency->trackedServiceFilter != NULL) {
+		tracker_createWithFilter(dependency->context, dependency->trackedServiceFilter, cust, &dependency->tracker);
+	} else if (dependency->trackedServiceName != NULL) {
 		tracker_create(dependency->context, dependency->trackedServiceName, cust, &dependency->tracker);
 	} else {
 
@@ -152,7 +157,24 @@ void serviceDependency_invokeRemoved(SER
 
 SERVICE_DEPENDENCY serviceDependency_setService(SERVICE_DEPENDENCY dependency, char * serviceName, char * filter) {
 	dependency->trackedServiceName = serviceName;
-//	dependency->filter = filter;
+
+	if (filter != NULL) {
+		if (serviceName != NULL) {
+			int len = strlen(serviceName) + strlen(OBJECTCLASS) + strlen(filter) + 7;
+			char *nfilter = malloc(sizeof(char) * len);
+			strcpy(nfilter, "(&(");
+			strcat(nfilter, OBJECTCLASS);
+			strcat(nfilter, "=");
+			strcat(nfilter, serviceName);
+			strcat(nfilter, ")");
+			strcat(nfilter, filter);
+			strcat(nfilter, ")\0");
+			dependency->trackedServiceFilter = nfilter;
+		} else {
+			dependency->trackedServiceFilter = filter;
+		}
+	}
+
 	return dependency;
 }
 

Modified: incubator/celix/trunk/dependency_manager/service_dependency.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/dependency_manager/service_dependency.h?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/dependency_manager/service_dependency.h (original)
+++ incubator/celix/trunk/dependency_manager/service_dependency.h Tue Aug 30 13:56:41 2011
@@ -46,6 +46,7 @@ struct serviceDependency {
 	BUNDLE_CONTEXT context;
 	void * serviceInstance;
 	char * trackedServiceName;
+	char * trackedServiceFilter;
 };
 
 typedef struct serviceDependency * SERVICE_DEPENDENCY;

Modified: incubator/celix/trunk/examples/whiteboard/publisherA/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/whiteboard/publisherA/activator.c?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/examples/whiteboard/publisherA/activator.c (original)
+++ incubator/celix/trunk/examples/whiteboard/publisherA/activator.c Tue Aug 30 13:56:41 2011
@@ -56,8 +56,11 @@ celix_status_t bundleActivator_start(voi
         data->ps->invoke = publisher_invoke;
         data->ps->publisher = data->pub;
 
+        PROPERTIES props = properties_create();
+        properties_set(props, "id", "A");
+
         SERVICE_REGISTRATION service_registration = NULL;
-        bundleContext_registerService(context, PUBLISHER_NAME, data->ps, NULL, &service_registration);
+        bundleContext_registerService(context, PUBLISHER_NAME, data->ps, props, &service_registration);
     } else {
         status = CELIX_START_ERROR;
     }

Modified: incubator/celix/trunk/examples/whiteboard/publisherB/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/whiteboard/publisherB/activator.c?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/examples/whiteboard/publisherB/activator.c (original)
+++ incubator/celix/trunk/examples/whiteboard/publisherB/activator.c Tue Aug 30 13:56:41 2011
@@ -55,8 +55,11 @@ celix_status_t bundleActivator_start(voi
         data->ps->invoke = publisher_invoke;
         data->ps->publisher = data->pub;
 
+        PROPERTIES props = properties_create();
+		properties_set(props, "id", "B");
+
     	SERVICE_REGISTRATION service_registration = NULL;
-    	bundleContext_registerService(context, PUBLISHER_NAME, data->ps, NULL, &service_registration);
+    	bundleContext_registerService(context, PUBLISHER_NAME, data->ps, props, &service_registration);
     } else {
         status = CELIX_START_ERROR;
     }

Modified: incubator/celix/trunk/examples/whiteboard/tracker_depman/dependency_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/whiteboard/tracker_depman/dependency_activator.c?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/examples/whiteboard/tracker_depman/dependency_activator.c (original)
+++ incubator/celix/trunk/examples/whiteboard/tracker_depman/dependency_activator.c Tue Aug 30 13:56:41 2011
@@ -54,7 +54,7 @@ void dm_init(void * userData, BUNDLE_CON
 
 	SERVICE_DEPENDENCY dep = dependencyActivatorBase_createServiceDependency(manager);
 	serviceDependency_setRequired(dep, false);
-	serviceDependency_setService(dep, PUBLISHER_NAME, NULL);
+	serviceDependency_setService(dep, PUBLISHER_NAME, "(|(id=A)(id=B))");
 	serviceDependency_setCallbacks(dep, tracker_addedServ, tracker_modifiedServ, tracker_removedServ);
 	serviceComponent_addServiceDependency(service, dep);
 

Modified: incubator/celix/trunk/framework/private/include/service_tracker.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/include/service_tracker.h?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/include/service_tracker.h (original)
+++ incubator/celix/trunk/framework/private/include/service_tracker.h Tue Aug 30 13:56:41 2011
@@ -45,7 +45,7 @@ struct tracked {
 typedef struct tracked * TRACKED;
 
 celix_status_t tracker_create(BUNDLE_CONTEXT context, char * service, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker);
-SERVICE_TRACKER tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer);
+celix_status_t tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker);
 
 void tracker_open(SERVICE_TRACKER tracker);
 void tracker_close(SERVICE_TRACKER tracker);

Modified: incubator/celix/trunk/framework/private/src/service_tracker.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/service_tracker.c?rev=1163212&r1=1163211&r2=1163212&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/service_tracker.c (original)
+++ incubator/celix/trunk/framework/private/src/service_tracker.c Tue Aug 30 13:56:41 2011
@@ -55,7 +55,7 @@ celix_status_t tracker_create(BUNDLE_CON
 				strcat(filter, "=");
 				strcat(filter, service);
 				strcat(filter, ")\0");
-				*tracker = tracker_createWithFilter(context, filter, customizer);
+				tracker_createWithFilter(context, filter, customizer, tracker);
 			}
 		}
 	}
@@ -64,22 +64,22 @@ celix_status_t tracker_create(BUNDLE_CON
 	return status;
 }
 
-SERVICE_TRACKER tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer) {
-	SERVICE_TRACKER tracker = (SERVICE_TRACKER) malloc(sizeof(*tracker));
+celix_status_t tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker) {
+	*tracker = (SERVICE_TRACKER) malloc(sizeof(*tracker));
 	FW_SERVICE_TRACKER fw_tracker = (FW_SERVICE_TRACKER) malloc(sizeof(*fw_tracker));
 	if (m_trackers == NULL) {
 		m_trackers = arrayList_create();
 	}
-	tracker->context = context;
-	tracker->filter = filter;
+	(*tracker)->context = context;
+	(*tracker)->filter = filter;
 
-	fw_tracker->tracker = tracker;
+	fw_tracker->tracker = *tracker;
 	fw_tracker->tracked = arrayList_create();
 	fw_tracker->customizer = customizer;
 
 	arrayList_add(m_trackers, fw_tracker);
 
-	return tracker;
+	return CELIX_SUCCESS;
 }
 
 void tracker_open(SERVICE_TRACKER tracker) {