celix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From abroekh...@apache.org
Subject svn commit: r1177180 - in /incubator/celix/trunk: ./ examples/ examples/echo_service/client/ examples/echo_service/server/ examples/osgi-in-action/ examples/osgi-in-action/chapter01-greeting-example/ examples/osgi-in-action/chapter01-greeting-example/c...
Date Thu, 29 Sep 2011 06:57:24 GMT
Author: abroekhuis
Date: Thu Sep 29 06:57:23 2011
New Revision: 1177180

URL: http://svn.apache.org/viewvc?rev=1177180&view=rev
Log:
Added examples

Added:
    incubator/celix/trunk/examples/osgi-in-action/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/CMakeLists.txt
      - copied, changed from r1173981, incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/README.TXT
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/CMakeLists.txt
      - copied, changed from r1173981, incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/MANIFEST.MF
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/client.c
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/CMakeLists.txt
      - copied, changed from r1173981, incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/MANIFEST.MF
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/greeting_impl.h
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/activator.c
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/greeting_impl.c
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/
    incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/greeting_service.h
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/CMakeLists.txt
      - copied, changed from r1173981, incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/MANIFEST.MF
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/README.TXT
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/activator.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/CMakeLists.txt
      - copied, changed from r1173981, incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/MANIFEST.MF
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/
    incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/activator.c
Modified:
    incubator/celix/trunk/examples/CMakeLists.txt
    incubator/celix/trunk/examples/echo_service/client/echo_client_activator.c
    incubator/celix/trunk/examples/echo_service/server/echo_server_activator.c
    incubator/celix/trunk/target.cmake

Modified: incubator/celix/trunk/examples/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/CMakeLists.txt?rev=1177180&r1=1177179&r2=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -25,4 +25,10 @@ add_subdirectory(mongoose)
 #add_subdirectory(echo_service/client)
 #add_subdirectory(echo_service/server)
 add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+add_subdirectory(echo_service)
+
+add_subdirectory(osgi-in-action/chapter04-correct-lookup)
+add_subdirectory(osgi-in-action/chapter04-correct-listener)
+add_subdirectory(osgi-in-action/chapter01-greeting-example)
+
+deploy(chapter01-greeting-example BUNDLES shell shell_tui log_service chapter01-greeting-example-client chapter01-greeting-example)
\ No newline at end of file

Modified: incubator/celix/trunk/examples/echo_service/client/echo_client_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/echo_service/client/echo_client_activator.c?rev=1177180&r1=1177179&r2=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/echo_service/client/echo_client_activator.c (original)
+++ incubator/celix/trunk/examples/echo_service/client/echo_client_activator.c Thu Sep 29 06:57:23 2011
@@ -36,15 +36,17 @@ struct echoActivator {
 	SERVICE_TRACKER tracker;
 };
 
-void * bundleActivator_create() {
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
 	struct echoActivator * act = malloc(sizeof(*act));
 	act->client = NULL;
 	act->tracker = NULL;
 
-	return act;
+	*userData = act;
+
+	return CELIX_SUCCESS;
 }
 
-void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 
 	SERVICE_TRACKER tracker = tracker_create(context, ECHO_SERVICE_NAME, NULL);
@@ -55,16 +57,22 @@ void bundleActivator_start(void * userDa
 
 	echoClient_start(act->client);
 	tracker_open(act->tracker);
+
+	return CELIX_SUCCESS;
 }
 
-void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 	tracker_close(act->tracker);
 	echoClient_stop(act->client);
+
+	return CELIX_SUCCESS;
 }
 
-void bundleActivator_destroy(void * userData) {
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 	echoClient_destroy(act->client);
 	tracker_destroy(act->tracker);
+
+	return CELIX_SUCCESS;
 }

Modified: incubator/celix/trunk/examples/echo_service/server/echo_server_activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/echo_service/server/echo_server_activator.c?rev=1177180&r1=1177179&r2=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/echo_service/server/echo_server_activator.c (original)
+++ incubator/celix/trunk/examples/echo_service/server/echo_server_activator.c Thu Sep 29 06:57:23 2011
@@ -34,13 +34,14 @@ struct echoActivator {
 	ECHO_SERVICE es;
 };
 
-void * bundleActivator_create() {
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
 	struct echoActivator * act = malloc(sizeof(*act));
 	act->reg = NULL;
-	return act;
+	*userData = act;
+	return CELIX_SUCCESS;
 }
 
-void bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 
 	ECHO_SERVICE es = malloc(sizeof(*es));
@@ -51,16 +52,20 @@ void bundleActivator_start(void * userDa
 	act->es = es;
 
     bundleContext_registerService(context, ECHO_SERVICE_NAME, es, NULL, &act->reg);
+
+    return CELIX_SUCCESS;
 }
 
-void bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 
 	serviceRegistration_unregister(act->reg);
 	act->reg = NULL;
+
+	return CELIX_SUCCESS;
 }
 
-void bundleActivator_destroy(void * userData) {
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
 	struct echoActivator * act = (struct echoActivator *) userData;
 	act->es->echo = NULL;
 	echoServer_destroy(act->es->server);
@@ -69,4 +74,6 @@ void bundleActivator_destroy(void * user
 	act->es = NULL;
 	act->reg = NULL;
 	free(act);
+
+	return CELIX_SUCCESS;
 }

Copied: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/CMakeLists.txt (from r1173981, incubator/celix/trunk/examples/CMakeLists.txt)
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/CMakeLists.txt?p2=incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/CMakeLists.txt&p1=incubator/celix/trunk/examples/CMakeLists.txt&r1=1173981&r2=1177180&rev=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -15,14 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(hello_world)
-add_subdirectory(mongoose)
-
-#add_subdirectory(receiver)
-#add_subdirectory(receiver-2.0)
-#add_subdirectory(sender)
-
-#add_subdirectory(echo_service/client)
-#add_subdirectory(echo_service/server)
-add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+add_subdirectory(greeting)
+add_subdirectory(client)

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/README.TXT
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/README.TXT?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/README.TXT (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/README.TXT Thu Sep 29 06:57:23 2011
@@ -0,0 +1,7 @@
+The example activates the bundles `chapter01-greeting-example` and  `chapter01-greeting-example-client`.
+The activator of the client bundle (client.c) tries to find the greeting service, but may fail at start-up,
+because it is activated before the greeting service is installed.
+
+When the text 'Greetings' does not appear, stop and start the `chapter01-greeting-example-client` bundle.
+Now the `chapter01-greeting-example` is already installed and the text `Greetings` does appear after the 
+restart of the client bundle.

Copied: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/CMakeLists.txt (from r1173981, incubator/celix/trunk/examples/CMakeLists.txt)
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/CMakeLists.txt?p2=incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/CMakeLists.txt&p1=incubator/celix/trunk/examples/CMakeLists.txt&r1=1173981&r2=1177180&rev=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -15,14 +15,11 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(hello_world)
-add_subdirectory(mongoose)
+add_library(chapter01-greeting-example-client SHARED private/src/client)
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("public/include")
+include_directories("private/include")
+include_directories("../greeting/public/include")
+target_link_libraries(chapter01-greeting-example-client framework)
 
-#add_subdirectory(receiver)
-#add_subdirectory(receiver-2.0)
-#add_subdirectory(sender)
-
-#add_subdirectory(echo_service/client)
-#add_subdirectory(echo_service/server)
-add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+bundle(chapter01-greeting-example-client)

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/MANIFEST.MF?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/MANIFEST.MF (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/MANIFEST/MANIFEST.MF Thu Sep 29 06:57:23 2011
@@ -0,0 +1,6 @@
+Bundle-SymbolicName: chapter01-greeting-example-client
+Bundle-Version: 1.0.0
+library: chapter01-greeting-example-client
+Import-Service: greeting-service
+
+

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/client.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/client.c?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/client.c (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/client/private/src/client.c Thu Sep 29 06:57:23 2011
@@ -0,0 +1,60 @@
+/**
+ *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.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <apr_general.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+#include "greeting_service.h"
+
+
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT ctx) {
+	SERVICE_REFERENCE ref = NULL;
+	celix_status_t status = bundleContext_getServiceReference(ctx, (char *) GREETING_SERVICE_NAME, &ref);
+	if (status == CELIX_SUCCESS) {
+		if (ref == NULL) {
+			printf("Greeting service reference not available\n");
+		} else {
+			GREETING_SERVICE greeting = NULL;
+			bundleContext_getService(ctx, ref, (void *) &greeting);
+			if (greeting == NULL){
+				printf("Greeting service not available\n");
+			} else {
+				bool result;
+				(*greeting->greeting_sayHello)(greeting->instance);
+				bundleContext_ungetService(ctx, ref, &result);
+			}
+		}
+	}
+	return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+	return CELIX_SUCCESS;
+}

Copied: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/CMakeLists.txt (from r1173981, incubator/celix/trunk/examples/CMakeLists.txt)
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/CMakeLists.txt?p2=incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/CMakeLists.txt&p1=incubator/celix/trunk/examples/CMakeLists.txt&r1=1173981&r2=1177180&rev=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -15,14 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(hello_world)
-add_subdirectory(mongoose)
+add_library(chapter01-greeting-example SHARED private/src/activator private/src/greeting_impl)
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("public/include")
+include_directories("private/include")
+target_link_libraries(chapter01-greeting-example framework)
 
-#add_subdirectory(receiver)
-#add_subdirectory(receiver-2.0)
-#add_subdirectory(sender)
-
-#add_subdirectory(echo_service/client)
-#add_subdirectory(echo_service/server)
-add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+bundle(chapter01-greeting-example)

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/MANIFEST.MF?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/MANIFEST.MF (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/MANIFEST/MANIFEST.MF Thu Sep 29 06:57:23 2011
@@ -0,0 +1,6 @@
+Bundle-SymbolicName: chapter01-greeting-example
+Bundle-Version: 1.0.0
+library: chapter01-greeting-example
+Export-Service: greeting-service
+Import-Service: greeting-service
+

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/greeting_impl.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/greeting_impl.h?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/greeting_impl.h (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/include/greeting_impl.h Thu Sep 29 06:57:23 2011
@@ -0,0 +1,29 @@
+/**
+ *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.
+ */
+#ifndef GREETING_IMPL_H_
+#define GREETING_IMPL_H_
+
+struct greeting {
+	char *name;
+};
+
+extern void greeting_sayHello(struct greeting *instance);
+
+
+#endif /* GREETING_IMPL_H_ */

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/activator.c?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/activator.c (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/activator.c Thu Sep 29 06:57:23 2011
@@ -0,0 +1,74 @@
+/**
+ *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.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <apr_general.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+#include "greeting_impl.h"
+#include "greeting_service.h"
+#include "service_registration.h"
+
+struct greetingActivator {
+	SERVICE_REGISTRATION reg;
+	apr_pool_t *pool;
+};
+
+typedef struct greetingActivator *GREETING_ACTIVATOR;
+
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+	apr_pool_t *pool;
+	GREETING_ACTIVATOR activator;
+	celix_status_t status = bundleContext_getMemoryPool(context, &pool);
+	if (status == CELIX_SUCCESS) {
+		*userData = apr_palloc(pool, sizeof(struct greetingActivator));
+		activator = *userData;
+		activator->reg = NULL;
+		activator->pool = pool;
+	}
+	return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+	struct greetingActivator * act = (struct greetingActivator *) userData;
+	celix_status_t status = CELIX_SUCCESS;
+	GREETING_SERVICE es = apr_palloc(act->pool, sizeof(*es));
+	es->instance = apr_palloc(act->pool, sizeof(*es->instance));
+	es->instance->name = GREETING_SERVICE_NAME;
+	es->greeting_sayHello = greeting_sayHello;
+
+    status = bundleContext_registerService(context, GREETING_SERVICE_NAME, es, NULL, &act->reg);
+	return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+	celix_status_t status = CELIX_SUCCESS;
+	struct greetingActivator * act = (struct greetingActivator *) userData;
+	serviceRegistration_unregister(act->reg);
+	act->reg = NULL;
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+	struct greetingActivator * act = (struct greetingActivator *) userData;
+	act->reg = NULL;
+	return CELIX_SUCCESS;
+}

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/greeting_impl.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/greeting_impl.c?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/greeting_impl.c (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/private/src/greeting_impl.c Thu Sep 29 06:57:23 2011
@@ -0,0 +1,25 @@
+/**
+ *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.
+ */
+#include <stdio.h>
+#include "greeting_impl.h"
+
+void greeting_sayHello(struct greeting *instance){
+	printf("Greetings from %s\n", instance->name);
+}
+

Added: incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/greeting_service.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/greeting_service.h?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/greeting_service.h (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter01-greeting-example/greeting/public/include/greeting_service.h Thu Sep 29 06:57:23 2011
@@ -0,0 +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
+ *
+ *  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.
+ */
+
+#ifndef GREETING_H_
+#define GREETING_H_
+
+#define GREETING_SERVICE_NAME "greeting-service"
+
+typedef struct greeting *GREETING;
+typedef struct greeting_service * GREETING_SERVICE;
+
+struct greeting_service {
+	GREETING instance;
+	void (*greeting_sayHello)(GREETING instance);
+};
+#endif /* GREETING_H_ */

Copied: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/CMakeLists.txt (from r1173981, incubator/celix/trunk/examples/CMakeLists.txt)
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/CMakeLists.txt?p2=incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/CMakeLists.txt&p1=incubator/celix/trunk/examples/CMakeLists.txt&r1=1173981&r2=1177180&rev=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -15,14 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(hello_world)
-add_subdirectory(mongoose)
+add_library(chapter04-correct-listener SHARED private/src/activator)
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
+target_link_libraries(chapter04-correct-listener framework)
 
-#add_subdirectory(receiver)
-#add_subdirectory(receiver-2.0)
-#add_subdirectory(sender)
-
-#add_subdirectory(echo_service/client)
-#add_subdirectory(echo_service/server)
-add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+bundle(chapter04-correct-listener)

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/MANIFEST.MF?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/MANIFEST.MF (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/MANIFEST/MANIFEST.MF Thu Sep 29 06:57:23 2011
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: chapter04-correct-listener
+Bundle-Version: 1.0.0
+library: chapter04-correct-listener
+Import-Service: log_service

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/README.TXT
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/README.TXT?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/README.TXT (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/README.TXT Thu Sep 29 06:57:23 2011
@@ -0,0 +1,6 @@
+In the log server a listener registers when the log_service bundle is stopped and 
+started by means of the serviceChanged() routine. This routine maintains the set of log
+services in the variable m_logServiceRefs. The function getLogService() returns the
+current LOG_SERVICE, if it is active or NULL.
+Starting and stopping the log_service bundle shows that the logServiceTest thread 
+correctly recognizes the non-availability of the log_services, when stopped.

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/activator.c?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/activator.c (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-listener/private/src/activator.c Thu Sep 29 06:57:23 2011
@@ -0,0 +1,258 @@
+/**
+ *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.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <apr_general.h>
+#include <unistd.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+#include "bundle.h"
+#include "log_service.h"
+#include "array_list.h"
+
+typedef log_service_t LOG_SERVICE;
+
+struct clientActivator {
+	BUNDLE_CONTEXT m_context;
+	SERVICE_LISTENER m_Loglistener;
+	apr_pool_t *pool;
+	char * service;
+};
+typedef struct clientActivator * CLIENT_ACTIVATOR;
+
+ARRAY_LIST m_logServiceRefs = NULL;
+static pthread_t m_logTestThread;
+pthread_mutex_t logListenerMutex;
+
+//*******************************************************************************
+// function prototypes
+//*******************************************************************************
+void serviceChanged(SERVICE_LISTENER listener, SERVICE_EVENT event);
+void startTestThread(void *userData);
+void stopTestThread();
+void pauseTestThread();
+void alternativeLog(char *message, BUNDLE_CONTEXT m_context);
+void logListener(CLIENT_ACTIVATOR activator);
+//*******************************************************************************
+// global functions
+//*******************************************************************************
+
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+	apr_pool_t *pool;
+	CLIENT_ACTIVATOR activator;
+	celix_status_t status = bundleContext_getMemoryPool(context, &pool);
+	if (status == CELIX_SUCCESS) {
+		*userData = apr_palloc(pool, sizeof(struct clientActivator));
+		activator = (CLIENT_ACTIVATOR) (*userData);
+		activator->service = "chapter04-correct-listener";
+		activator->m_Loglistener = NULL;
+		activator->pool = pool;
+		activator->m_context = context;
+		m_logServiceRefs = arrayList_create();
+		/* init the logServiceListener mutex */
+		pthread_mutex_init(&logListenerMutex, NULL);
+	} else {
+		status = CELIX_START_ERROR;
+	}
+	return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+	int i;
+	celix_status_t status = CELIX_SUCCESS;
+	CLIENT_ACTIVATOR clientActivator = (CLIENT_ACTIVATOR) userData;
+	ARRAY_LIST refs = NULL;
+	SERVICE_EVENT event = NULL;
+	struct clientActivator * activator = (struct clientActivator *) userData;
+	logListener(activator);
+	// after adding the listener check for any existing services that need pseudo events
+	// to register the existing services in the m_logServiceRefs list
+	status = bundleContext_getServiceReferences(context, NULL, NULL, &refs);
+	if (status == CELIX_SUCCESS){
+		if (refs != NULL) {
+			for (i = 0; (i < arrayList_size(refs)); i++){
+				event = apr_palloc(clientActivator->pool, sizeof(struct serviceEvent));
+				event->reference = arrayList_get(m_logServiceRefs, i);
+				event->type = REGISTERED;
+				serviceChanged(clientActivator->m_Loglistener, event);
+			}
+		} else {
+			alternativeLog("no bundle references\n", context);
+		}
+		startTestThread(userData);
+	}
+	return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+	struct clientActivator * act = (struct clientActivator *) userData;
+	stopTestThread();
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+	struct clientActivator * act = (struct clientActivator *) userData;
+	arrayList_destroy(m_logServiceRefs);
+	return CELIX_SUCCESS;
+}
+
+void serviceChanged(SERVICE_LISTENER listener, SERVICE_EVENT event) {
+	pthread_mutex_lock(&logListenerMutex);
+	switch (event->type) {
+	case REGISTERED:
+		printf("reg\n");
+		arrayList_add(m_logServiceRefs, event->reference);
+		break;
+	case MODIFIED:
+		printf("mod\n");
+		// only the service metadata has changed, so no need to do anything here
+		break;
+	case UNREGISTERING:
+		printf("unr\n");
+		arrayList_remove(m_logServiceRefs,
+				arrayList_indexOf(m_logServiceRefs, event->reference));
+		break;
+	default:
+		break;
+	}
+	pthread_mutex_unlock(&logListenerMutex);
+}
+
+// we must lock the listener before querying the internal state
+LOG_SERVICE getLogService(BUNDLE_CONTEXT context) {
+	LOG_SERVICE logService = NULL;
+	celix_status_t status = CELIX_SUCCESS;
+	pthread_mutex_lock(&logListenerMutex);
+	if (arrayList_size(m_logServiceRefs) > 0) {
+		// the last service reference should have the highest ranking
+		status = bundleContext_getService(context,
+				arrayList_get(m_logServiceRefs, 0), (void **) &logService);
+		if (status != CELIX_SUCCESS){
+			printf("could not find service\n");
+		}
+	}
+	pthread_mutex_unlock(&logListenerMutex);
+	return logService;
+}
+
+// Test LogService by periodically sending a message
+void *logServiceTest (void *argument){
+	int tid;
+	LOG_SERVICE logService = NULL;
+	CLIENT_ACTIVATOR data = (CLIENT_ACTIVATOR) argument;
+	while (pthread_self() == m_logTestThread) {
+		SERVICE_REFERENCE logServiceRef = NULL;
+		// lookup the current "best" LogService each time, just before we need to use it
+		//bundleContext_getServiceReference(m_context, (char *) LOG_SERVICE_NAME, &logServiceRef);
+		logService = getLogService(data->m_context);
+		// if the dereferenced instance is null then we know the service has been removed
+		if (logService != NULL) {
+			(*(logService->log))(logService->logger, LOG_INFO, "ping");
+		} else {
+			alternativeLog("LogService has gone", data->m_context);
+		}
+		pauseTestThread();
+	}
+	return NULL;
+}
+
+
+
+//------------------------------------------------------------------------------------------
+//  The rest of this is just support code, not meant to show any particular best practices
+//------------------------------------------------------------------------------------------
+
+
+void startTestThread(void *userData) {
+	// start separate worker thread to run the actual tests, managed by the bundle lifecycle
+	pthread_create(&m_logTestThread, NULL,logServiceTest, userData);
+}
+
+void stopTestThread() {
+	// thread should cooperatively shutdown on the next iteration, because field is now null
+	pthread_t testThread = m_logTestThread;
+	pthread_cancel(testThread);
+	pthread_join(testThread, NULL);
+	m_logTestThread = 0;
+}
+
+void pauseTestThread() {
+	// sleep for a bit
+	sleep(5);
+}
+
+void alternativeLog(char *message, BUNDLE_CONTEXT m_context) {
+	// this provides similar style debug logging output for when the LogService disappears
+	BUNDLE bundle = NULL;
+	celix_status_t status = CELIX_SUCCESS;
+	char tid[20], bid[20];
+	long bundleId;
+	if (m_context != NULL) {
+		celix_status_t rc = bundleContext_getBundle(m_context, &bundle);
+		if (status == CELIX_SUCCESS) {
+			celix_status_t rc = bundle_getBundleId(bundle, &bundleId);
+			if (status == CELIX_SUCCESS) {
+				sprintf(tid, "thread=%s", "Thread");
+				sprintf(bid, "bundle=%ld", bundleId);
+				printf("<--> %s, %s : %s\n", tid, bid, message);
+			} else {
+				printf("%s:%s:%d:getBundleId failed:  %s\n", __FILE__, __FUNCTION__, __LINE__, message);
+			}
+		} else {
+			printf("%s:%s:%d:getBundle failed: %s\n", __FILE__, __FUNCTION__, __LINE__, message);
+		}
+	}	else {
+		printf("%s:%d:bundle context NULL:  %s\n", __FILE__, __LINE__, message);
+	}
+}
+
+void logListener(CLIENT_ACTIVATOR activator)
+{
+	celix_status_t status;
+	char filter[30];
+	int i;
+	SERVICE_REFERENCE r = NULL;
+	SERVICE_LISTENER m_Loglistener = NULL;
+	SERVICE_EVENT e = NULL;
+	ARRAY_LIST refs = NULL;
+	/* listener code */
+	m_Loglistener = (SERVICE_LISTENER) apr_palloc(activator->pool, sizeof(*m_Loglistener));
+	activator->m_Loglistener = m_Loglistener;
+	m_Loglistener->handle = NULL;
+	m_Loglistener->serviceChanged = (void *) serviceChanged;
+	sprintf(filter, "(objectClass=%s)", LOG_SERVICE_NAME);
+	status = bundleContext_addServiceListener(activator->m_context, m_Loglistener, filter);
+	if (status == CELIX_SUCCESS) {
+		// after adding the listener check for any existing services that need pseudo events
+		bundleContext_getServiceReferences(activator->m_context, NULL, filter, &refs);
+		if (refs != NULL) {
+			for (i = 0; i < arrayList_size(refs); i++) {
+				r = (SERVICE_REFERENCE) arrayList_get(refs, i);
+				e = apr_palloc(activator->pool, sizeof(struct clientActivator));
+				e->type = REGISTERED;
+				e->reference = r;
+				(*m_Loglistener->serviceChanged)(m_Loglistener, e);
+			}
+		}
+	} else {
+		printf("could not add service listener\n");
+	}
+}

Copied: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/CMakeLists.txt (from r1173981, incubator/celix/trunk/examples/CMakeLists.txt)
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/CMakeLists.txt?p2=incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/CMakeLists.txt&p1=incubator/celix/trunk/examples/CMakeLists.txt&r1=1173981&r2=1177180&rev=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/examples/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/CMakeLists.txt Thu Sep 29 06:57:23 2011
@@ -15,14 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-add_subdirectory(hello_world)
-add_subdirectory(mongoose)
+add_library(chapter04-correct-lookup SHARED private/src/activator)
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
+target_link_libraries(chapter04-correct-lookup framework pthread)
 
-#add_subdirectory(receiver)
-#add_subdirectory(receiver-2.0)
-#add_subdirectory(sender)
-
-#add_subdirectory(echo_service/client)
-#add_subdirectory(echo_service/server)
-add_subdirectory(whiteboard)
-#add_subdirectory(echo_service)
\ No newline at end of file
+bundle(chapter04-correct-lookup)

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/MANIFEST.MF?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/MANIFEST.MF (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/MANIFEST/MANIFEST.MF Thu Sep 29 06:57:23 2011
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: chapter04-correct-lookup
+Bundle-Version: 1.0.0
+library: chapter04-correct-lookup
+Import-Service: log_service

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/activator.c?rev=1177180&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/activator.c (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-correct-lookup/private/src/activator.c Thu Sep 29 06:57:23 2011
@@ -0,0 +1,158 @@
+/**
+ *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.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <apr_general.h>
+#include <unistd.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+#include "pthread.h"
+#include "log_service.h"
+#include "bundle.h"
+
+typedef log_service_t LOG_SERVICE;
+
+struct threadData {
+	char * service;
+	int threadId;
+	BUNDLE_CONTEXT m_context;
+};
+
+typedef struct threadData *THREAD_DATA;
+
+static pthread_t m_logTestThread;
+
+
+//*******************************************************************************
+// function prototypes
+//*******************************************************************************
+void startTestThread(THREAD_DATA data);
+void stopTestThread();
+void pauseTestThread();
+void alternativeLog(char *message, THREAD_DATA data);
+//*******************************************************************************
+// global functions
+//*******************************************************************************
+
+celix_status_t bundleActivator_create(BUNDLE_CONTEXT context, void **userData) {
+	apr_pool_t *pool;
+	celix_status_t status = bundleContext_getMemoryPool(context, &pool);
+	if (status == CELIX_SUCCESS) {
+		*userData = apr_palloc(pool, sizeof(struct threadData));
+		((THREAD_DATA)(*userData))->service = "chapter04-correct-lookup";
+		((THREAD_DATA)(*userData))->threadId = 0;
+		((THREAD_DATA)(*userData))->m_context = context;
+	} else {
+		status = CELIX_START_ERROR;
+	}
+	return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT context) {
+	((THREAD_DATA) userData)->m_context = context;
+	startTestThread(((THREAD_DATA) userData));
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
+	stopTestThread();
+	return CELIX_SUCCESS;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, BUNDLE_CONTEXT context) {
+	return CELIX_SUCCESS;
+}
+
+//------------------------------------------------------------------------------------------
+//  The rest of this is just support code, not meant to show any particular best practices
+//------------------------------------------------------------------------------------------
+
+// Test LogService by periodically sending a message
+void *LogServiceTest (void *argument){
+	celix_status_t status = CELIX_SUCCESS;
+	THREAD_DATA data = (THREAD_DATA) argument;
+	BUNDLE_CONTEXT m_context = ((THREAD_DATA) argument)->m_context;
+	while (pthread_self() == m_logTestThread) {
+		SERVICE_REFERENCE logServiceRef = NULL;
+		// lookup the current "best" LogService each time, just before we need to use it
+		status = bundleContext_getServiceReference(m_context, (char *) LOG_SERVICE_NAME, &logServiceRef);
+		// if the service reference is null then we know there's no log service available
+		if (status == CELIX_SUCCESS && logServiceRef != NULL) {
+			void *log = NULL;
+			LOG_SERVICE logService = NULL;
+			bundleContext_getService(m_context, logServiceRef, &log);
+			logService = (LOG_SERVICE) log;
+			// if the dereferenced instance is null then we know the service has been removed
+			if (logService != NULL) {
+				(*(logService->log))(logService->logger, LOG_INFO, "ping");
+			} else {
+				alternativeLog("LogService has gone", data);
+			}
+		} else {
+			alternativeLog("LogService has gone", data);
+		}
+		pauseTestThread();
+	}
+	return NULL;
+}
+
+void startTestThread(THREAD_DATA data) {
+	// start separate worker thread to run the actual tests, managed by the bundle lifecycle
+	data->threadId++;
+	int  rc = pthread_create(&m_logTestThread, NULL, LogServiceTest, data);
+}
+
+void stopTestThread() {
+	// thread should cooperatively shutdown on the next iteration, because field is now null
+	pthread_t testThread = m_logTestThread;
+	pthread_cancel(testThread);
+	pthread_join(testThread, NULL);
+	m_logTestThread = 0;
+}
+
+void pauseTestThread() {
+	// sleep for a bit
+	sleep(5);
+}
+
+void alternativeLog(char *message, THREAD_DATA data) {
+	// this provides similar style debug logging output for when the LogService disappears
+	celix_status_t status = CELIX_SUCCESS;
+	BUNDLE bundle = NULL;
+	char tid[20], bid[20];
+	long bundleId;
+	if (data->m_context != NULL) {
+		status = bundleContext_getBundle(data->m_context, &bundle);
+		if (status == CELIX_SUCCESS) {
+			status = bundle_getBundleId(bundle, &bundleId);
+			if (status == CELIX_SUCCESS) {
+				sprintf(tid, "thread=%d", data->threadId);
+				sprintf(bid, "bundle=%ld", bundleId);
+				printf("<--> %s, %s : %s\n", tid, bid, message);
+			} else {
+				printf("%s:%s:%d:getBundleId failed:  %s\n", __FILE__, __FUNCTION__, __LINE__, message);
+			}
+		} else {
+			printf("%s:%s:%d:getBundle failed: %s\n", __FILE__, __FUNCTION__, __LINE__, message);
+		}
+	} else {
+		printf("%s:%s:%d:bundle context NULL:  %s\n", __FILE__, __FUNCTION__, __LINE__, message);
+	}
+}

Modified: incubator/celix/trunk/target.cmake
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/target.cmake?rev=1177180&r1=1177179&r2=1177180&view=diff
==============================================================================
--- incubator/celix/trunk/target.cmake (original)
+++ incubator/celix/trunk/target.cmake Thu Sep 29 06:57:23 2011
@@ -21,4 +21,4 @@ deploy("hello_world" BUNDLES shell shell
 #deploy("deployer" BUNDLES shell shell_tui deployer)
 deploy("wb" BUNDLES tracker publisherA publisherB shell shell_tui log_service log_writer)
 deploy("wb_dp" BUNDLES tracker_depman publisherA publisherB shell shell_tui log_service log_writer)
-#deploy("echo" BUNDLES echo_server echo_client shell shell_tui)
\ No newline at end of file
+deploy("echo" BUNDLES echo_server echo_client shell shell_tui)
\ No newline at end of file



Mime
View raw message