Author: pnoltes
Date: Sun Jun 30 10:22:24 2013
New Revision: 1498079
URL: http://svn.apache.org/r1498079
Log:
CELIX-65: moved slp discovery to discovery_slp directory and added a - net yet
complete - discovery_bonjour. CMakeLists.txt file still use discovery_slp as
default.
Added:
incubator/celix/trunk/remote_services/discovery_bonjour/
incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt
(with props)
incubator/celix/trunk/remote_services/discovery_bonjour/private/
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h
(with props)
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
(with props)
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
(with props)
incubator/celix/trunk/remote_services/discovery_slp/
incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt (with
props)
incubator/celix/trunk/remote_services/discovery_slp/private/
incubator/celix/trunk/remote_services/discovery_slp/private/include/
incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
(with props)
incubator/celix/trunk/remote_services/discovery_slp/private/src/
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
(with props)
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
(with props)
Modified:
incubator/celix/trunk/remote_services/CMakeLists.txt
incubator/celix/trunk/remote_services/deploy.cmake
Modified: incubator/celix/trunk/remote_services/CMakeLists.txt
URL:
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/CMakeLists.txt?rev=1498079&r1=1498078&r2=1498079&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/CMakeLists.txt (original)
+++ incubator/celix/trunk/remote_services/CMakeLists.txt Sun Jun 30 10:22:24
2013
@@ -33,7 +33,8 @@ if (REMOTE_SERVICE_ADMIN)
add_subdirectory(topology_manager)
add_subdirectory(remote_service_admin)
- add_subdirectory(discovery)
+ add_subdirectory(discovery_slp)
+ #add_subdirectory(discovery_bonjour)
add_subdirectory(example_service)
add_subdirectory(example_endpoint)
Modified: incubator/celix/trunk/remote_services/deploy.cmake
URL:
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/deploy.cmake?rev=1498079&r1=1498078&r2=1498079&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/deploy.cmake (original)
+++ incubator/celix/trunk/remote_services/deploy.cmake Sun Jun 30 10:22:24 2013
@@ -16,6 +16,9 @@
# under the License.
is_enabled(REMOTE_SERVICE_ADMIN)
if (REMOTE_SERVICE_ADMIN)
- deploy("remote-services" BUNDLES discovery topology_manager
remote_service_admin example example_endpoint shell shell_tui log_service
log_writer)
- deploy("remote-services-client" BUNDLES discovery topology_manager
remote_service_admin example_proxy shell shell_tui log_service log_writer
calc_shell)
+ #deploy("remote-services" BUNDLES discovery_bonjour topology_manager
remote_service_admin example example_endpoint shell shell_tui log_service
log_writer)
+ #deploy("remote-services-client" BUNDLES discovery_bonjour
topology_manager remote_service_admin example_proxy shell shell_tui log_service
log_writer calc_shell)
+
+ deploy("remote-services" BUNDLES discovery_slp topology_manager
remote_service_admin example example_endpoint shell shell_tui log_service
log_writer)
+ deploy("remote-services-client" BUNDLES discovery_slp topology_manager
remote_service_admin example_proxy shell shell_tui log_service log_writer
calc_shell)
endif (REMOTE_SERVICE_ADMIN)
Added: 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=1498079&view=auto
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt
(added)
+++ incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt Sun
Jun 30 10:22:24 2013
@@ -0,0 +1,38 @@
+# 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.
+
+#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")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/discovery/private/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/endpoint_listener/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
+include_directories(private/include)
+
+SET_HEADER(BUNDLE_SYMBOLICNAME "apache_celix_rsa_discovery_bonjour")
+SET_HEADERS("Bundle-Name: Apache Celix RSA BONJOUR Discovery")
+
+bundle(discovery_bonjour SOURCES
+ private/src/discovery
+ private/src/discovery_activator
+)
+
+target_link_libraries(discovery_bonjour celix_framework ${APRUTIL_LIBRARY}) #
TODO ${SLP_LIBRARIES})
+
Propchange:
incubator/celix/trunk/remote_services/discovery_bonjour/CMakeLists.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h
URL:
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h?rev=1498079&view=auto
==============================================================================
---
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h
(added)
+++
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,48 @@
+/**
+ *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.
+ */
+/*
+ * topology_manager.h
+ *
+ * \date Sep 29, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef DISCOVERY_H_
+#define DISCOVERY_H_
+
+#include "endpoint_listener.h"
+
+typedef struct discovery *discovery_pt;
+
+celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context,
discovery_pt *discovery);
+celix_status_t discovery_stop(discovery_pt discovery);
+
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt
endpoint, char *machtedFilter);
+celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt
endpoint, char *machtedFilter);
+
+celix_status_t discovery_endpointListenerAdding(void * handle,
service_reference_pt reference, void **service);
+celix_status_t discovery_endpointListenerAdded(void * handle,
service_reference_pt reference, void * service);
+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);
+
+
+#endif /* DISCOVERY_H_ */
Propchange:
incubator/celix/trunk/remote_services/discovery_bonjour/private/include/discovery.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
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=1498079&view=auto
==============================================================================
---
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
(added)
+++
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,328 @@
+/**
+ *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.
+ */
+/*
+ * discovery.c
+ *
+ * \date Oct 4, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <apr_strings.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include <dns_sd.h>
+
+#include "bundle_context.h"
+#include "array_list.h"
+#include "utils.h"
+#include "celix_errno.h"
+#include "filter.h"
+#include "service_reference.h"
+#include "service_registration.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 const char * const DEFAULT_RSA_PORT = "555";
+static const char * const OSGI_SERVICE_TYPE = "_osgi._udp";
+
+struct discovery {
+ bundle_context_pt context;
+ apr_pool_t *pool;
+
+ hash_map_pt listenerReferences;
+
+ bool running;
+ apr_thread_t *poll;
+ DNSServiceRef browseRef;
+
+ hash_map_pt slpServices;
+
+ char *rsaPort;
+
+ array_list_pt handled;
+ array_list_pt registered;
+};
+
+celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context,
discovery_pt *discovery) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *discovery = apr_palloc(pool, sizeof(**discovery));
+ if (!*discovery) {
+ status = CELIX_ENOMEM;
+ } else {
+ (*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)->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)->handled = NULL;
+ arrayList_create(pool, &(*discovery)->handled);
+ (*discovery)->registered = NULL;
+ arrayList_create(pool, &(*discovery)->registered);
+
+ DNSServiceErrorType error = DNSServiceBrowse(
+ &(*discovery)->browseRef,
+ 0,
+ 0,
+ OSGI_SERVICE_TYPE,
+ NULL, /* may be NULL */
+ discovery_browseCallback,
+ (*discovery)/* may be NULL */
+ );
+
+ 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;
+
+ apr_status_t tstat;
+ discovery->running = false;
+ DNSServiceRefDeallocate(discovery->browseRef);
+ apr_status_t stat = apr_thread_join(&tstat, discovery->poll);
+ if (stat != APR_SUCCESS && tstat != APR_SUCCESS) {
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+
+ int i;
+ for (i = 0; i < arrayList_size(discovery->registered); i++) {
+ char *url = arrayList_get(discovery->registered, i);
+ discovery_deregisterEndpoint(discovery, url);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt
endpoint, char *machtedFilter) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ printf("discovery_endpointAdded CALLED\n");
+
+ 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 */
+ );
+
+
+ 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;
+ return status;
+}
+
+celix_status_t discovery_endpointListenerAdding(void * handle,
service_reference_pt reference, void **service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ bundleContext_getService(discovery->context, reference, service);
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerAdded(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ service_registration_pt registration = NULL;
+ serviceReference_getServiceRegistration(reference, ®istration);
+ properties_pt serviceProperties = NULL;
+ serviceRegistration_getProperties(registration, &serviceProperties);
+ char *discoveryListener = properties_get(serviceProperties,
"DISCOVERY");
+
+ if (discoveryListener != NULL && strcmp(discoveryListener, "true") ==
0) {
+ printf("DISCOVERY: EndpointListener Ignored - Discovery
listener\n");
+ } else {
+ printf("DISCOVERY: EndpointListener Added - Add Scope\n");
+ discovery_updateEndpointListener(discovery, reference,
(endpoint_listener_pt) service);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerModified(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ printf("DISCOVERY: EndpointListener Modified - Update Scope TODO\n");
+
+ return status;
+}
+
+
+
+celix_status_t discovery_endpointListenerRemoved(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ printf("DISCOVERY: EndpointListener Removed\n");
+ hashMap_remove(discovery->listenerReferences, reference);
+
+ return status;
+}
+
+celix_status_t discovery_updateEndpointListener(discovery_pt discovery,
+ service_reference_pt reference, endpoint_listener_pt service) {
+ celix_status_t status = CELIX_SUCCESS;
+ return status;
+}
+
+static void *APR_THREAD_FUNC discovery_poll(apr_thread_t *thd, void *data) {
+ discovery_pt discovery = data;
+
+ while (discovery->running) {
+ DNSServiceProcessResult(discovery->browseRef);
+ }
+ apr_thread_exit(thd, APR_SUCCESS);
+
+ return NULL;
+}
+
+static void discovery_browseCallback(DNSServiceRef sdRef, DNSServiceFlags
flags,
+ uint32_t interfaceIndex, DNSServiceErrorType errorCode,
+ const char *serviceName, const char *regtype, const char
*replyDomain,
+ void *context) {
+ discovery_pt discovery = context;
+ if (flags & kDNSServiceFlagsAdd) {
+ printf("Added service with %s %s %s\n", serviceName, regtype,
+ replyDomain);
+ DNSServiceRef resolveRef = NULL;
+ DNSServiceErrorType resolveError =
DNSServiceResolve(&resolveRef, 0, 0,
+ serviceName, regtype, replyDomain,
discovery_resolveCallback,
+ context);
+ printf("Resolve return with error %i\n", resolveError);
+ DNSServiceProcessResult(resolveRef);
+ } else {
+ printf("Removed service with %s %s %s\n", serviceName, regtype,
+ replyDomain);
+ }
+}
+
+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)
{
+ 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);
+ }
+}
+
+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");
+
+ return status;
+}
+
+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;
+}
+
+static celix_status_t discovery_removeService(discovery_pt discovery,
endpoint_description_pt endpoint) {
+ celix_status_t status = CELIX_SUCCESS;
+ //TODO should be called when dns-sd notices a removal of a services,
forward to listeners
+ return status;
+}
Propchange:
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
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=1498079&view=auto
==============================================================================
---
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
(added)
+++
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,152 @@
+/**
+ *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.
+ */
+/*
+ * dependency_activator.c
+ *
+ * \date Sep 29, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <apr_strings.h>
+#include <apr_uuid.h>
+
+#include "bundle_activator.h"
+#include "service_tracker.h"
+#include "service_registration.h"
+#include "constants.h"
+
+#include "discovery.h"
+#include "endpoint_listener.h"
+#include "remote_constants.h"
+
+struct activator {
+ apr_pool_t *pool;
+ bundle_context_pt context;
+
+ discovery_pt discovery;
+
+ service_tracker_pt endpointListenerTracker;
+ service_registration_pt endpointListenerService;
+};
+
+celix_status_t discoveryActivator_createEPLTracker(struct activator
*activator, service_tracker_pt *tracker);
+celix_status_t discoveryActivator_getUUID(struct activator *activator, char
**uuidStr);
+
+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;
+ struct activator *activator = NULL;
+
+ bundleContext_getMemoryPool(context, &parentPool);
+ apr_pool_create(&pool, parentPool);
+ activator = apr_palloc(pool, sizeof(*activator));
+ if (!activator) {
+ status = CELIX_ENOMEM;
+ } else {
+ activator->pool = pool;
+ activator->context = context;
+ activator->endpointListenerTracker = NULL;
+ activator->endpointListenerService = NULL;
+
+ discovery_create(pool, context, &activator->discovery);
+
+ discoveryActivator_createEPLTracker(activator,
&activator->endpointListenerTracker);
+
+ *userData = activator;
+ }
+
+ return status;
+}
+
+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);
+
+ if (status == CELIX_SUCCESS) {
+ status = serviceTracker_create(activator->pool,
activator->context, "endpoint_listener", customizer, tracker);
+
+ serviceTracker_open(activator->endpointListenerTracker);
+ }
+
+ return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt
context) {
+ celix_status_t status = CELIX_SUCCESS;
+ struct activator *activator = userData;
+ apr_pool_t *pool = NULL;
+ apr_pool_create(&pool, activator->pool);
+
+ endpoint_listener_pt endpointListener = apr_palloc(pool,
sizeof(*endpointListener));
+ endpointListener->handle = activator->discovery;
+ endpointListener->endpointAdded = discovery_endpointAdded;
+ endpointListener->endpointRemoved = discovery_endpointRemoved;
+
+ properties_pt props = properties_create();
+ properties_set(props, "DISCOVERY", "true");
+ char *uuid = NULL;
+ discoveryActivator_getUUID(activator, &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);
+
+ return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt
context) {
+ celix_status_t status = CELIX_SUCCESS;
+ struct activator *activator = userData;
+
+ discovery_stop(activator->discovery);
+ serviceTracker_close(activator->endpointListenerTracker);
+ serviceRegistration_unregister(activator->endpointListenerService);
+
+ 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 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;
+}
Propchange:
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery_activator.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt
URL:
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt?rev=1498079&view=auto
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt (added)
+++ incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt Sun Jun
30 10:22:24 2013
@@ -0,0 +1,37 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# 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.
+
+find_package(Slp REQUIRED)
+
+include_directories(${SLP_INCLUDE_DIRS})
+include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/discovery/private/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/endpoint_listener/public/include")
+include_directories("${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include")
+include_directories("private/include")
+
+SET_HEADER(BUNDLE_SYMBOLICNAME "apache_celix_rsa_discovery_slp")
+SET_HEADERS("Bundle-Name: Apache Celix RSA SLP Discovery")
+
+bundle(discovery_slp SOURCES
+ private/src/discovery
+ private/src/discovery_activator
+)
+
+target_link_libraries(discovery_slp celix_framework ${APRUTIL_LIBRARY}
${SLP_LIBRARIES})
+
Propchange: incubator/celix/trunk/remote_services/discovery_slp/CMakeLists.txt
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
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=1498079&view=auto
==============================================================================
---
incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
(added)
+++
incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,48 @@
+/**
+ *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.
+ */
+/*
+ * topology_manager.h
+ *
+ * \date Sep 29, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef DISCOVERY_H_
+#define DISCOVERY_H_
+
+#include "endpoint_listener.h"
+
+typedef struct discovery *discovery_pt;
+
+celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context,
discovery_pt *discovery);
+celix_status_t discovery_stop(discovery_pt discovery);
+
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt
endpoint, char *machtedFilter);
+celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt
endpoint, char *machtedFilter);
+
+celix_status_t discovery_endpointListenerAdding(void * handle,
service_reference_pt reference, void **service);
+celix_status_t discovery_endpointListenerAdded(void * handle,
service_reference_pt reference, void * service);
+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);
+
+
+#endif /* DISCOVERY_H_ */
Propchange:
incubator/celix/trunk/remote_services/discovery_slp/private/include/discovery.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
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=1498079&view=auto
==============================================================================
--- incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
(added)
+++ incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,493 @@
+/**
+ *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.
+ */
+/*
+ * discovery.c
+ *
+ * \date Oct 4, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <apr_strings.h>
+#include <slp.h>
+#include <unistd.h>
+
+#include "bundle_context.h"
+#include "array_list.h"
+#include "utils.h"
+#include "celix_errno.h"
+#include "filter.h"
+#include "service_reference.h"
+#include "service_registration.h"
+
+#include "discovery.h"
+
+struct discovery {
+ bundle_context_pt context;
+ apr_pool_t *pool;
+
+ hash_map_pt listenerReferences;
+
+ bool running;
+ apr_thread_t *slpPoll;
+
+ hash_map_pt slpServices;
+
+ char *rsaPort;
+
+ array_list_pt handled;
+ array_list_pt registered;
+};
+
+struct slp_service {
+ char *serviceUrl;
+ char *attributes;
+};
+
+typedef struct slp_service *slp_service_pt;
+
+celix_status_t discovery_informListener(discovery_pt discovery,
endpoint_listener_pt listener, endpoint_description_pt endpoint);
+celix_status_t discovery_informListenerOfRemoval(discovery_pt discovery,
endpoint_listener_pt listener, endpoint_description_pt endpoint);
+
+celix_status_t discovery_addService(discovery_pt discovery,
endpoint_description_pt endpoint);
+celix_status_t discovery_removeService(discovery_pt discovery,
endpoint_description_pt endpoint);
+
+static void *APR_THREAD_FUNC discovery_pollSLP(apr_thread_t *thd, void *data);
+SLPBoolean discovery_pollSLPCallback(SLPHandle hslp, const char* srvurl,
unsigned short lifetime, SLPError errcode, void* cookie);
+SLPBoolean discovery_attributesCallback(SLPHandle hslp, const char
*attributes, SLPError error, void *cookie);
+
+celix_status_t discovery_deregisterEndpoint(discovery_pt discovery, const char
*serviceUrl);
+void discovery_deregistrationReport(SLPHandle hslp, SLPError errcode, void*
cookie);
+
+celix_status_t discovery_create(apr_pool_t *pool, bundle_context_pt context,
discovery_pt *discovery) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *discovery = apr_palloc(pool, sizeof(**discovery));
+ if (!*discovery) {
+ status = CELIX_ENOMEM;
+ } else {
+ (*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)->running = true;
+ (*discovery)->rsaPort = getenv("RSA_PORT");
+ if ((*discovery)->rsaPort == NULL) {
+ printf("No RemoteServiceAdmin port set, set it using
RSA_PORT!\n");
+ }
+ (*discovery)->handled = NULL;
+ arrayList_create(pool, &(*discovery)->handled);
+ (*discovery)->registered = NULL;
+ arrayList_create(pool, &(*discovery)->registered);
+
+ apr_thread_create(&(*discovery)->slpPoll, NULL,
discovery_pollSLP, *discovery, (*discovery)->pool);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_deregisterEndpoint(discovery_pt discovery, const char
*serviceUrl) {
+ celix_status_t status = CELIX_SUCCESS;
+ printf("DISCOVERY: Remove endpoint: %s\n", serviceUrl);
+
+ SLPError err;
+ SLPError callbackerr;
+ SLPHandle slp;
+
+ err = SLPOpen("en", SLP_FALSE, &slp);
+ if (err != SLP_OK) {
+ status = CELIX_BUNDLE_EXCEPTION;
+ } else {
+ err = SLPDereg(slp, serviceUrl, discovery_deregistrationReport,
&callbackerr);
+ if ((err != SLP_OK) || (callbackerr != SLP_OK)) {
+ printf("DISCOVERY: Error deregistering service (%s)
with slp %i\n", serviceUrl, err);
+ status = CELIX_BUNDLE_EXCEPTION;
+ }
+ SLPClose(slp);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_stop(discovery_pt discovery) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ apr_status_t tstat;
+ discovery->running = false;
+ apr_status_t stat = apr_thread_join(&tstat, discovery->slpPoll);
+ if (stat != APR_SUCCESS && tstat != APR_SUCCESS) {
+ 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);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_removeService(discovery_pt discovery,
endpoint_description_pt endpoint) {
+ celix_status_t status = CELIX_SUCCESS;
+ printf("DISCOVERY: Remove service (%s)\n", endpoint->service);
+
+ // Inform listeners of new endpoint
+ 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;
+ bundleContext_getService(discovery->context, reference,
(void**)&listener);
+ discovery_informListenerOfRemoval(discovery, listener,
endpoint);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_addService(discovery_pt discovery,
endpoint_description_pt endpoint) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ // Inform listeners of new endpoint
+ 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);
+ discovery_informListener(discovery, listener, endpoint);
+ }
+ }
+
+ return status;
+}
+
+celix_status_t discovery_informListener(discovery_pt discovery,
endpoint_listener_pt listener, endpoint_description_pt endpoint) {
+ celix_status_t status = CELIX_SUCCESS;
+ listener->endpointAdded(listener->handle, endpoint, NULL);
+ return status;
+}
+
+celix_status_t discovery_informListenerOfRemoval(discovery_pt discovery,
endpoint_listener_pt listener, endpoint_description_pt endpoint) {
+ celix_status_t status = CELIX_SUCCESS;
+ listener->endpointRemoved(listener->handle, endpoint, NULL);
+ return status;
+}
+
+celix_status_t discovery_constructServiceUrl(discovery_pt discovery,
endpoint_description_pt endpoint, char **serviceUrl) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (*serviceUrl != NULL || discovery == NULL || endpoint == 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,
discovery->pool);
+ if (stat != APR_SUCCESS) {
+ status = CELIX_BUNDLE_EXCEPTION;
+ } else {
+ stat = apr_sockaddr_info_get(&sa, host, APR_INET, 0, 0,
discovery->pool);
+ 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(discovery->pool, "service:osgi.remote:http://", ip, ":",
discovery->rsaPort, "/services/", endpoint->service, NULL);
+ }
+ }
+ }
+ }
+
+ return status;
+}
+
+void discovery_registrationReport(SLPHandle hslp, SLPError errcode, void*
cookie) {
+ *(SLPError*)cookie = errcode;
+}
+
+celix_status_t discovery_endpointAdded(void *handle, endpoint_description_pt
endpoint, char *machtedFilter) {
+ celix_status_t status = CELIX_SUCCESS;
+ printf("DISCOVERY: Endpoint for %s, with filter \"%s\" added\n",
endpoint->service, machtedFilter);
+ discovery_pt discovery = handle;
+ SLPError err;
+ SLPError callbackerr;
+ SLPHandle slp;
+ char *serviceUrl = NULL;
+
+ err = SLPOpen("en", SLP_FALSE, &slp);
+ if (err != SLP_OK) {
+ status = CELIX_ILLEGAL_STATE;
+ } else {
+ status = discovery_constructServiceUrl(discovery, endpoint,
&serviceUrl);
+ if (status == CELIX_SUCCESS) {
+ char *attributes = "";
+ 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);
+ if (strlen(attributes) != 0) {
+ attributes =
apr_pstrcat(discovery->pool, attributes, ",", NULL);
+ }
+ attributes = apr_pstrcat(discovery->pool,
attributes, "(", key, "=", value, ")", NULL);
+ }
+ err = SLPReg(slp, serviceUrl, SLP_LIFETIME_MAXIMUM, 0,
attributes, SLP_TRUE, discovery_registrationReport, &callbackerr);
+ if ((err != SLP_OK) || (callbackerr != SLP_OK)) {
+ status = CELIX_ILLEGAL_STATE;
+ printf("DISCOVERY: Error registering service
(%s) with slp %i\n", serviceUrl, err);
+ }
+ arrayList_add(discovery->registered, serviceUrl);
+ }
+ SLPClose(slp);
+ }
+
+ return status;
+}
+
+void discovery_deregistrationReport(SLPHandle hslp, SLPError errcode, void*
cookie) {
+ *(SLPError*)cookie = errcode;
+}
+
+celix_status_t discovery_endpointRemoved(void *handle, endpoint_description_pt
endpoint, char *machtedFilter) {
+ celix_status_t status = CELIX_SUCCESS;
+ printf("DISCOVERY: Endpoint for %s, with filter \"%s\" removed\n",
endpoint->service, machtedFilter);
+
+ discovery_pt discovery = handle;
+ SLPError err;
+ SLPError callbackerr;
+ SLPHandle slp;
+ char *serviceUrl = NULL;
+
+ err = SLPOpen("en", SLP_FALSE, &slp);
+ if (err != SLP_OK) {
+ status = CELIX_ILLEGAL_STATE;
+ } else {
+ status = discovery_constructServiceUrl(discovery, endpoint,
&serviceUrl);
+ if (status == CELIX_SUCCESS) {
+ status = discovery_deregisterEndpoint(discovery,
serviceUrl);
+ int i;
+ for (i = 0; i < arrayList_size(discovery->registered);
i++) {
+ char *url =
arrayList_get(discovery->registered, i);
+ if (strcmp(url, serviceUrl) == 0) {
+ arrayList_remove(discovery->registered,
i);
+ }
+ }
+ }
+ }
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerAdding(void * handle,
service_reference_pt reference, void **service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ bundleContext_getService(discovery->context, reference, service);
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerAdded(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ service_registration_pt registration = NULL;
+ serviceReference_getServiceRegistration(reference, ®istration);
+ properties_pt serviceProperties = NULL;
+ serviceRegistration_getProperties(registration, &serviceProperties);
+ char *discoveryListener = properties_get(serviceProperties,
"DISCOVERY");
+
+ if (discoveryListener != NULL && strcmp(discoveryListener, "true") ==
0) {
+ printf("DISCOVERY: EndpointListener Ignored - Discovery
listener\n");
+ } else {
+ printf("DISCOVERY: EndpointListener Added - Add Scope\n");
+ discovery_updateEndpointListener(discovery, reference,
(endpoint_listener_pt) service);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerModified(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ printf("DISCOVERY: EndpointListener Modified - Update Scope\n");
+ discovery_updateEndpointListener(discovery, reference,
(endpoint_listener_pt) service);
+
+ return status;
+}
+
+celix_status_t discovery_updateEndpointListener(discovery_pt discovery,
service_reference_pt reference, endpoint_listener_pt service) {
+ celix_status_t status = CELIX_SUCCESS;
+ char *scope = "createScopeHere";
+
+ array_list_pt scopes = hashMap_get(discovery->listenerReferences,
reference);
+ if (scopes == NULL) {
+ scopes = NULL;
+ arrayList_create(discovery->pool, &scopes);
+ hashMap_put(discovery->listenerReferences, reference, scopes);
+ }
+
+ if (!arrayList_contains(scopes, scope)) {
+ arrayList_add(scopes, scope);
+ }
+
+ hash_map_iterator_pt iter =
hashMapIterator_create(discovery->slpServices);
+ while (hashMapIterator_hasNext(iter)) {
+ hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+ char *key = hashMapEntry_getKey(entry);
+ endpoint_description_pt value = hashMapEntry_getValue(entry);
+ discovery_informListener(discovery, service, value);
+ }
+
+ return status;
+}
+
+celix_status_t discovery_endpointListenerRemoved(void * handle,
service_reference_pt reference, void * service) {
+ celix_status_t status = CELIX_SUCCESS;
+ discovery_pt discovery = handle;
+
+ printf("DISCOVERY: EndpointListener Removed\n");
+ hashMap_remove(discovery->listenerReferences, reference);
+
+ return status;
+}
+
+static void *APR_THREAD_FUNC discovery_pollSLP(apr_thread_t *thd, void *data) {
+ discovery_pt discovery = data;
+ SLPHandle slp;
+ SLPError err;
+
+ err = SLPOpen("en", SLP_FALSE, &slp);
+
+ while (discovery->running) {
+ SLPError err = SLP_TRUE;
+ SLPError callbackerr;
+ arrayList_clear(discovery->handled);
+ while (err == SLP_TRUE) {
+ err = SLPFindSrvs(slp, "osgi.remote", 0, 0,
discovery_pollSLPCallback, data);
+ }
+
+ hash_map_iterator_pt iter =
hashMapIterator_create(discovery->slpServices);
+ while (hashMapIterator_hasNext(iter)) {
+ hash_map_entry_pt entry =
hashMapIterator_nextEntry(iter);
+ char *key = hashMapEntry_getKey(entry);
+ endpoint_description_pt value =
hashMapEntry_getValue(entry);
+
+ bool inUse = false;
+ int i;
+ for (i = 0; i < arrayList_size(discovery->handled);
i++) {
+ char *url = arrayList_get(discovery->handled,
i);
+ if (strcmp(url, key) == 0) {
+ inUse = true;
+ break;
+ }
+ }
+
+ if (!inUse) {
+ discovery_removeService(discovery, value);
+
+ hashMapIterator_remove(iter);
+ }
+ }
+
+ sleep(1);
+ }
+ SLPClose(slp);
+ apr_thread_exit(thd, APR_SUCCESS);
+
+ return NULL;
+}
+
+SLPBoolean discovery_pollSLPCallback(SLPHandle hslp, const char* srvurl,
unsigned short lifetime, SLPError errcode, void *cookie) {
+ discovery_pt discovery = cookie;
+ if (errcode == SLP_OK) {
+
+ arrayList_add(discovery->handled, (void *) srvurl);
+ if (!hashMap_containsKey(discovery->slpServices, (void *)
srvurl)) {
+ //
service:osgi.remote:http://10.0.0.21:8080/services/example
+ if (strncmp(srvurl, "service:osgi.remote:", 20) == 0) {
+ const char *url = srvurl+20;
+ const char *srv = strrchr(url, '/')+1;
+
+ SLPHandle handle = NULL;
+ SLPError err = SLPOpen("en", SLP_FALSE,
&handle);
+ err = SLP_TRUE;
+ slp_service_pt slpService =
apr_palloc(discovery->pool, sizeof(*slpService));
+ while (err == SLP_TRUE) {
+ err = SLPFindAttrs(handle, srvurl, "",
"", discovery_attributesCallback, slpService);
+ }
+
+ properties_pt props = properties_create();
+ char *track;
+ char *token =
apr_strtok(slpService->attributes, ",", &track);
+ while (token != NULL) {
+ char *track2;
+ char *token2 = apr_strtok(token, "=",
&track2);
+ char *token3 = apr_strtok(NULL, "=",
&track2);
+ char *key =
apr_pstrdup(discovery->pool, token2+1);
+ char *value =
apr_pstrndup(discovery->pool, token3, strlen(token3) - 1);
+ properties_set(props, key, value);
+ token = apr_strtok(NULL, ",", &track);
+ }
+
+ endpoint_description_pt endpoint =
apr_palloc(discovery->pool, sizeof(*endpoint));
+ endpoint->id = apr_pstrdup(discovery->pool,
url);
+ endpoint->serviceId = 42;
+ endpoint->service =
apr_pstrdup(discovery->pool, srv);
+ endpoint->properties = props;
+ discovery_addService(discovery, endpoint);
+
+ hashMap_put(discovery->slpServices,
apr_pstrdup(discovery->pool, srvurl), endpoint);
+ }
+ }
+ } else if (errcode == SLP_LAST_CALL) {
+ return SLP_FALSE;
+ } else {
+ }
+
+ return SLP_TRUE;
+}
+
+SLPBoolean discovery_attributesCallback(SLPHandle hslp, const char
*attributes, SLPError error, void *cookie) {
+ slp_service_pt slpService = cookie;
+ if (error == SLP_OK) {
+ slpService->attributes = strdup(attributes);
+ } else if (error == SLP_LAST_CALL) {
+ return SLP_FALSE;
+ }
+
+ return SLP_TRUE;
+}
Propchange:
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
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=1498079&view=auto
==============================================================================
---
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
(added)
+++
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
Sun Jun 30 10:22:24 2013
@@ -0,0 +1,152 @@
+/**
+ *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.
+ */
+/*
+ * dependency_activator.c
+ *
+ * \date Sep 29, 2011
+ * \author <a href="mailto:[email protected]">Apache
Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <apr_strings.h>
+#include <apr_uuid.h>
+
+#include "bundle_activator.h"
+#include "service_tracker.h"
+#include "service_registration.h"
+#include "constants.h"
+
+#include "discovery.h"
+#include "endpoint_listener.h"
+#include "remote_constants.h"
+
+struct activator {
+ apr_pool_t *pool;
+ bundle_context_pt context;
+
+ discovery_pt discovery;
+
+ service_tracker_pt endpointListenerTracker;
+ service_registration_pt endpointListenerService;
+};
+
+celix_status_t discoveryActivator_createEPLTracker(struct activator
*activator, service_tracker_pt *tracker);
+celix_status_t discoveryActivator_getUUID(struct activator *activator, char
**uuidStr);
+
+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;
+ struct activator *activator = NULL;
+
+ bundleContext_getMemoryPool(context, &parentPool);
+ apr_pool_create(&pool, parentPool);
+ activator = apr_palloc(pool, sizeof(*activator));
+ if (!activator) {
+ status = CELIX_ENOMEM;
+ } else {
+ activator->pool = pool;
+ activator->context = context;
+ activator->endpointListenerTracker = NULL;
+ activator->endpointListenerService = NULL;
+
+ discovery_create(pool, context, &activator->discovery);
+
+ discoveryActivator_createEPLTracker(activator,
&activator->endpointListenerTracker);
+
+ *userData = activator;
+ }
+
+ return status;
+}
+
+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);
+
+ if (status == CELIX_SUCCESS) {
+ status = serviceTracker_create(activator->pool,
activator->context, "endpoint_listener", customizer, tracker);
+
+ serviceTracker_open(activator->endpointListenerTracker);
+ }
+
+ return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt
context) {
+ celix_status_t status = CELIX_SUCCESS;
+ struct activator *activator = userData;
+ apr_pool_t *pool = NULL;
+ apr_pool_create(&pool, activator->pool);
+
+ endpoint_listener_pt endpointListener = apr_palloc(pool,
sizeof(*endpointListener));
+ endpointListener->handle = activator->discovery;
+ endpointListener->endpointAdded = discovery_endpointAdded;
+ endpointListener->endpointRemoved = discovery_endpointRemoved;
+
+ properties_pt props = properties_create();
+ properties_set(props, "DISCOVERY", "true");
+ char *uuid = NULL;
+ discoveryActivator_getUUID(activator, &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);
+
+ return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt
context) {
+ celix_status_t status = CELIX_SUCCESS;
+ struct activator *activator = userData;
+
+ discovery_stop(activator->discovery);
+ serviceTracker_close(activator->endpointListenerTracker);
+ serviceRegistration_unregister(activator->endpointListenerService);
+
+ 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 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;
+}
Propchange:
incubator/celix/trunk/remote_services/discovery_slp/private/src/discovery_activator.c
------------------------------------------------------------------------------
svn:mime-type = text/plain