From commits-return-4448-archive-asf-public=cust-asf.ponee.io@celix.apache.org Wed Jan 24 19:30:36 2018 Return-Path: X-Original-To: archive-asf-public@eu.ponee.io Delivered-To: archive-asf-public@eu.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by mx-eu-01.ponee.io (Postfix) with ESMTP id 40F85180799 for ; Wed, 24 Jan 2018 19:30:36 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 3197E160C4E; Wed, 24 Jan 2018 18:30:36 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 7FDE8160C3C for ; Wed, 24 Jan 2018 19:30:33 +0100 (CET) Received: (qmail 54443 invoked by uid 500); 24 Jan 2018 18:30:32 -0000 Mailing-List: contact commits-help@celix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@celix.apache.org Delivered-To: mailing list commits@celix.apache.org Received: (qmail 54426 invoked by uid 99); 24 Jan 2018 18:30:32 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 24 Jan 2018 18:30:32 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id D17E1EF792; Wed, 24 Jan 2018 18:30:31 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: pnoltes@apache.org To: commits@celix.apache.org Date: Wed, 24 Jan 2018 18:30:32 -0000 Message-Id: <81d7b301e491418b89056ccb0cb08817@git.apache.org> In-Reply-To: <04cd87c20241465fb5262ffee9ee68d9@git.apache.org> References: <04cd87c20241465fb5262ffee9ee68d9@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/8] celix git commit: CELIX-417: Refactors cmake usage of pubsub and rsa. Started with installing exported targets http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/import_registration_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/remote_service_admin_common/src/import_registration_impl.c b/remote_services/remote_service_admin_common/src/import_registration_impl.c deleted file mode 100644 index 9a84327..0000000 --- a/remote_services/remote_service_admin_common/src/import_registration_impl.c +++ /dev/null @@ -1,274 +0,0 @@ -/** - *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. - */ -/* - * import_registration_impl.c - * - * \date Oct 14, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ - -#include -#include - -#include - -#include "celix_errno.h" - -#include "import_registration_impl.h" -#include "remote_service_admin_impl.h" - -struct import_reference { - endpoint_description_pt endpoint; - service_reference_pt reference; -}; - - - -celix_status_t importRegistration_proxyFactoryAdding(void * handle, service_reference_pt reference, void **service); -celix_status_t importRegistration_proxyFactoryAdded(void * handle, service_reference_pt reference, void *service); -celix_status_t importRegistration_proxyFactoryModified(void * handle, service_reference_pt reference, void *service); -celix_status_t importRegistration_proxyFactoryRemoved(void * handle, service_reference_pt reference, void *service); - -celix_status_t importRegistration_create(endpoint_description_pt endpoint, remote_service_admin_pt rsa, sendToHandle sendToCallback, bundle_context_pt context, import_registration_pt *registration) { - celix_status_t status = CELIX_SUCCESS; - - *registration = calloc(1, sizeof(**registration)); - if (!*registration) { - status = CELIX_ENOMEM; - } else { - (*registration)->context = context; - (*registration)->closed = false; - (*registration)->endpointDescription = endpoint; - (*registration)->rsa = rsa; - (*registration)->sendToCallback = sendToCallback; - (*registration)->reference = NULL; - (*registration)->importReference = NULL; - } - - return status; -} - -celix_status_t importRegistration_destroy(import_registration_pt registration) -{ - free(registration); - - return CELIX_SUCCESS; -} - - -celix_status_t importRegistrationFactory_create(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory) { - celix_status_t status = CELIX_SUCCESS; - - *registration_factory = calloc(1, sizeof(**registration_factory)); - if (!*registration_factory) { - status = CELIX_ENOMEM; - } else { - (*registration_factory)->serviceName = strdup(serviceName); - (*registration_factory)->context = context; - (*registration_factory)->bundle = NULL; - (*registration_factory)->loghelper = helper; - - arrayList_create(&(*registration_factory)->registrations); - } - - return status; -} - - - -celix_status_t importRegistrationFactory_destroy(import_registration_factory_pt* registration_factory) { - celix_status_t status = CELIX_SUCCESS; - - if (*registration_factory != NULL) - { - free((*registration_factory)->serviceName); - arrayList_destroy((*registration_factory)->registrations); - - serviceTracker_destroy((*registration_factory)->proxyFactoryTracker); - free(*registration_factory); - - *registration_factory = NULL; - } - - - return status; -} - - -celix_status_t importRegistrationFactory_open(import_registration_factory_pt registration_factory) -{ - celix_status_t status; - - const char *bundleStore = NULL; - bundleContext_getProperty(registration_factory->context, BUNDLE_STORE_PROPERTY_NAME, &bundleStore); - - if (bundleStore == NULL) { - bundleStore = DEFAULT_BUNDLE_STORE; - } - - char name[256]; - snprintf(name, 256, "%s/%s_proxy.zip", bundleStore, registration_factory->serviceName); - - status = bundleContext_installBundle(registration_factory->context, name, ®istration_factory->bundle); - - if (status == CELIX_SUCCESS) { - status = bundle_start(registration_factory->bundle); - if (status == CELIX_SUCCESS) { - logHelper_log(registration_factory->loghelper, OSGI_LOGSERVICE_INFO, "%s successfully started.", name); - } - } - else { - logHelper_log(registration_factory->loghelper, OSGI_LOGSERVICE_ERROR, "%s could not be installed.", name); - } - - return status; -} - -celix_status_t importRegistrationFactory_close(import_registration_factory_pt registration_factory) -{ - celix_status_t status = CELIX_SUCCESS; - - - if (registration_factory->proxyFactoryTracker != NULL) { - serviceTracker_close(registration_factory->proxyFactoryTracker); - } - - if (registration_factory->bundle != NULL) { - bundle_uninstall(registration_factory->bundle); - } - - return status; -} - - -celix_status_t importRegistration_createProxyFactoryTracker(import_registration_factory_pt registration_factory, service_tracker_pt *tracker) { - celix_status_t status; - service_tracker_customizer_pt customizer = NULL; - - status = serviceTrackerCustomizer_create(registration_factory, importRegistration_proxyFactoryAdding, importRegistration_proxyFactoryAdded, importRegistration_proxyFactoryModified, importRegistration_proxyFactoryRemoved, &customizer); - - if (status == CELIX_SUCCESS) { - char filter[512]; - - snprintf(filter, 512, "(&(%s=%s)(proxy.interface=%s))", (char*) OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_PROXY_FACTORY, registration_factory->serviceName); - status = serviceTracker_createWithFilter(registration_factory->context, filter, customizer, tracker); - - if (status == CELIX_SUCCESS) - { - serviceTracker_open(*tracker); - } - } - - return status; -} - -celix_status_t importRegistration_proxyFactoryAdding(void * handle, service_reference_pt reference, void **service) { - celix_status_t status = CELIX_SUCCESS; - import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; - - bundleContext_getService(registration_factory->context, reference, service); - - return status; -} - -celix_status_t importRegistration_proxyFactoryAdded(void * handle, service_reference_pt reference, void *service) { - celix_status_t status = CELIX_SUCCESS; - - import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; - registration_factory->trackedFactory = (remote_proxy_factory_service_pt) service; - - return status; -} - -celix_status_t importRegistration_proxyFactoryModified(void * handle, service_reference_pt reference, void *service) { - celix_status_t status = CELIX_SUCCESS; - - return status; -} - -celix_status_t importRegistration_proxyFactoryRemoved(void * handle, service_reference_pt reference, void *service) { - celix_status_t status = CELIX_SUCCESS; - - import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; - registration_factory->trackedFactory = NULL; - - return status; -} - - - -celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory) -{ - celix_status_t status; - - if ( (status = importRegistrationFactory_create(helper, serviceName, context, registration_factory)) == CELIX_SUCCESS) { - // starting the proxy tracker first allows us to pick up already available proxy factories - importRegistration_createProxyFactoryTracker(*registration_factory, &((*registration_factory)->proxyFactoryTracker)); - logHelper_log((*registration_factory)->loghelper, OSGI_LOGSERVICE_INFO, "remoteServiceAdmin_importService: new registration_factory added for %s at %p", serviceName, (*registration_factory)->proxyFactoryTracker); - - // check whether factory is available - if (((*registration_factory)->trackedFactory == NULL) && ((status = importRegistrationFactory_open(*registration_factory)) != CELIX_SUCCESS)) { - logHelper_log((*registration_factory)->loghelper, OSGI_LOGSERVICE_ERROR, "remoteServiceAdmin_importService: cannot open registration_factory for %s.", serviceName); - - importRegistrationFactory_close(*registration_factory); - importRegistrationFactory_destroy(registration_factory); - } - } - - return status; -} - - - - -celix_status_t importRegistration_getException(import_registration_pt registration) { - celix_status_t status = CELIX_SUCCESS; - return status; -} - - -celix_status_t importRegistration_getImportReference(import_registration_pt registration, import_reference_pt *reference) { - celix_status_t status = CELIX_SUCCESS; - - if (registration->importReference == NULL) { - registration->importReference = calloc(1, sizeof(*registration->importReference)); - if (registration->importReference == NULL) { - status = CELIX_ENOMEM; - } else { - registration->importReference->endpoint = registration->endpointDescription; - registration->importReference->reference = registration->reference; - } - } - - *reference = registration->importReference; - - return status; -} - - -celix_status_t importReference_getImportedEndpoint(import_reference_pt reference) { - celix_status_t status = CELIX_SUCCESS; - return status; -} - -celix_status_t importReference_getImportedService(import_reference_pt reference) { - celix_status_t status = CELIX_SUCCESS; - return status; -} http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/import_registration_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/remote_service_admin_common/src/import_registration_impl.h b/remote_services/remote_service_admin_common/src/import_registration_impl.h deleted file mode 100644 index 7aa397f..0000000 --- a/remote_services/remote_service_admin_common/src/import_registration_impl.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - *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. - */ -/* - * import_registration_impl.h - * - * \date Oct 14, 2011 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ - -#ifndef IMPORT_REGISTRATION_IMPL_H_ -#define IMPORT_REGISTRATION_IMPL_H_ - -#include "remote_service_admin.h" -#include "remote_proxy.h" -#include "service_tracker.h" -#include "log_helper.h" - -struct import_registration { - bundle_context_pt context; - endpoint_description_pt endpointDescription; - - service_reference_pt reference; - import_reference_pt importReference; - - remote_service_admin_pt rsa; - sendToHandle sendToCallback; - - bool closed; -}; - - - -struct import_registration_factory -{ - char* serviceName; - log_helper_pt loghelper; - remote_proxy_factory_service_pt trackedFactory; - service_tracker_pt proxyFactoryTracker; - bundle_context_pt context; - array_list_pt registrations; - bundle_pt bundle; -}; - - -celix_status_t importRegistration_create(endpoint_description_pt endpoint, remote_service_admin_pt rsa, sendToHandle callback, bundle_context_pt context, import_registration_pt *registration); -celix_status_t importRegistration_destroy(import_registration_pt registration); - -celix_status_t importRegistration_setEndpointDescription(import_registration_pt registration, endpoint_description_pt endpointDescription); -celix_status_t importRegistration_setHandler(import_registration_pt registration, void * handler); -celix_status_t importRegistration_setCallback(import_registration_pt registration, sendToHandle callback); - -celix_status_t importRegistration_getException(import_registration_pt registration); -celix_status_t importRegistration_getImportReference(import_registration_pt registration, import_reference_pt *reference); - -celix_status_t importRegistration_createProxyFactoryTracker(import_registration_factory_pt registration_factory, service_tracker_pt *tracker); - -celix_status_t importRegistrationFactory_destroy(import_registration_factory_pt* registration_factory); -//celix_status_t importRegistrationFactory_open(import_registration_factory_pt registration_factory); -celix_status_t importRegistrationFactory_close(import_registration_factory_pt registration_factory); -celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory); - - - -#endif /* IMPORT_REGISTRATION_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c b/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c deleted file mode 100644 index 9f996d6..0000000 --- a/remote_services/remote_service_admin_common/src/remote_proxy_factory_impl.c +++ /dev/null @@ -1,252 +0,0 @@ -/** - * 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. - */ - -/* - * remote_proxy_factory_impl.c - * - * \date 22 Dec 2014 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ - -#include -#include - -#include "remote_proxy.h" - -typedef struct proxy_instance { - service_registration_pt registration_ptr; - void *service; - properties_pt properties; -} *proxy_instance_pt; - -static celix_status_t remoteProxyFactory_registerProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, remote_service_admin_pt rsa, sendToHandle sendToCallback); -static celix_status_t remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription); - -celix_status_t remoteProxyFactory_create(bundle_context_pt context, char *service, void *handle, - createProxyService create, destroyProxyService destroy, - remote_proxy_factory_pt *remote_proxy_factory_ptr) { - celix_status_t status = CELIX_SUCCESS; - - *remote_proxy_factory_ptr = calloc(1, sizeof(**remote_proxy_factory_ptr)); - if (!*remote_proxy_factory_ptr) { - status = CELIX_ENOMEM; - } - - if (status == CELIX_SUCCESS) { - (*remote_proxy_factory_ptr)->context_ptr = context; - (*remote_proxy_factory_ptr)->service = strdup(service); - - (*remote_proxy_factory_ptr)->remote_proxy_factory_service_ptr = NULL; - (*remote_proxy_factory_ptr)->properties = NULL; - (*remote_proxy_factory_ptr)->registration = NULL; - - (*remote_proxy_factory_ptr)->proxy_instances = hashMap_create(NULL, NULL, NULL, NULL); - - (*remote_proxy_factory_ptr)->handle = handle; - - (*remote_proxy_factory_ptr)->create_proxy_service_ptr = create; - (*remote_proxy_factory_ptr)->destroy_proxy_service_ptr = destroy; - } - - return status; -} - -celix_status_t remoteProxyFactory_destroy(remote_proxy_factory_pt *remote_proxy_factory_ptr) { - celix_status_t status = CELIX_SUCCESS; - - if (!*remote_proxy_factory_ptr) { - status = CELIX_ILLEGAL_ARGUMENT; - } - - if (status == CELIX_SUCCESS) { - if ((*remote_proxy_factory_ptr)->proxy_instances) { - hashMap_destroy((*remote_proxy_factory_ptr)->proxy_instances, false, false); - (*remote_proxy_factory_ptr)->proxy_instances = NULL; - } - if ((*remote_proxy_factory_ptr)->service) { - free((*remote_proxy_factory_ptr)->service); - (*remote_proxy_factory_ptr)->service = NULL; - } - free(*remote_proxy_factory_ptr); - *remote_proxy_factory_ptr = NULL; - } - - return status; -} - -celix_status_t remoteProxyFactory_register(remote_proxy_factory_pt remote_proxy_factory_ptr) { - celix_status_t status = CELIX_SUCCESS; - - remote_proxy_factory_ptr->remote_proxy_factory_service_ptr = calloc(1, sizeof(*remote_proxy_factory_ptr->remote_proxy_factory_service_ptr)); - if (!remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) { - status = CELIX_ENOMEM; - } - - if (status == CELIX_SUCCESS) { - remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->factory = remote_proxy_factory_ptr; - remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->registerProxyService = remoteProxyFactory_registerProxyService; - remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->unregisterProxyService = remoteProxyFactory_unregisterProxyService; - - remote_proxy_factory_ptr->properties = properties_create(); - if (!remote_proxy_factory_ptr->properties) { - status = CELIX_BUNDLE_EXCEPTION; - } else { - properties_set(remote_proxy_factory_ptr->properties, "proxy.interface", remote_proxy_factory_ptr->service); - } - } - - if (status == CELIX_SUCCESS) { - status = bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, OSGI_RSA_REMOTE_PROXY_FACTORY, - remote_proxy_factory_ptr->remote_proxy_factory_service_ptr, remote_proxy_factory_ptr->properties, &remote_proxy_factory_ptr->registration); - } - - return status; -} - -celix_status_t remoteProxyFactory_unregister(remote_proxy_factory_pt remote_proxy_factory_ptr) { - celix_status_t status = CELIX_SUCCESS; - - if (!remote_proxy_factory_ptr) { - status = CELIX_ILLEGAL_ARGUMENT; - } - - // #TODO Remove proxy registrations - if (status == CELIX_SUCCESS) { - - hash_map_iterator_pt iter = hashMapIterator_create(remote_proxy_factory_ptr->proxy_instances); - while(hashMapIterator_hasNext(iter)){ - proxy_instance_pt proxy_instance_ptr = (proxy_instance_pt)hashMapIterator_nextValue(iter); - - if (proxy_instance_ptr->service) { - remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle, proxy_instance_ptr->service); - } - free(proxy_instance_ptr); - } - hashMapIterator_destroy(iter); - - if (remote_proxy_factory_ptr->registration) { - status = serviceRegistration_unregister(remote_proxy_factory_ptr->registration); - remote_proxy_factory_ptr->properties = NULL; - } - if (remote_proxy_factory_ptr->properties) { - properties_destroy(remote_proxy_factory_ptr->properties); - } - if (remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) { - free(remote_proxy_factory_ptr->remote_proxy_factory_service_ptr); - } - } - - return status; -} - - -static celix_status_t remoteProxyFactory_registerProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, remote_service_admin_pt rsa, sendToHandle sendToCallback) { - celix_status_t status = CELIX_SUCCESS; - proxy_instance_pt proxy_instance_ptr = NULL; - - if (!remote_proxy_factory_ptr || !remote_proxy_factory_ptr->create_proxy_service_ptr) { - status = CELIX_ILLEGAL_ARGUMENT; - } - - if (status == CELIX_SUCCESS) { - proxy_instance_ptr = calloc(1, sizeof(*proxy_instance_ptr)); - if (!proxy_instance_ptr) { - status = CELIX_ENOMEM; - } - } - - if (status == CELIX_SUCCESS) { - proxy_instance_ptr->properties = properties_create(); - if (!proxy_instance_ptr->properties) { - status = CELIX_ENOMEM; - } - } - - if (status == CELIX_SUCCESS) { - status = remote_proxy_factory_ptr->create_proxy_service_ptr(remote_proxy_factory_ptr->handle, endpointDescription, rsa, sendToCallback, proxy_instance_ptr->properties, &proxy_instance_ptr->service); - } - - if (status == CELIX_SUCCESS) { - properties_set(proxy_instance_ptr->properties, "proxy.interface", remote_proxy_factory_ptr->service); - - hash_map_iterator_pt iter = hashMapIterator_create(endpointDescription->properties); - while (hashMapIterator_hasNext(iter)) { - hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); - char *key = hashMapEntry_getKey(entry); - char *value = hashMapEntry_getValue(entry); - - properties_set(proxy_instance_ptr->properties, key, value); - } - hashMapIterator_destroy(iter); - } - - if (status == CELIX_SUCCESS) { - status = bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, remote_proxy_factory_ptr->service, proxy_instance_ptr->service, proxy_instance_ptr->properties, &proxy_instance_ptr->registration_ptr); - } - - if (status == CELIX_SUCCESS) { - hashMap_put(remote_proxy_factory_ptr->proxy_instances, endpointDescription, proxy_instance_ptr); - } - - if(status!=CELIX_SUCCESS){ - if(proxy_instance_ptr != NULL){ - if(proxy_instance_ptr->properties != NULL){ - properties_destroy(proxy_instance_ptr->properties); - } - free(proxy_instance_ptr); - } - } - - return status; -} - -static celix_status_t remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription) { - celix_status_t status = CELIX_SUCCESS; - proxy_instance_pt proxy_instance_ptr = NULL; - - if (!remote_proxy_factory_ptr || !endpointDescription || !remote_proxy_factory_ptr->proxy_instances || !remote_proxy_factory_ptr->handle) { - status = CELIX_ILLEGAL_ARGUMENT; - } - - if (status == CELIX_SUCCESS) { - proxy_instance_ptr = hashMap_remove(remote_proxy_factory_ptr->proxy_instances, endpointDescription); - if (proxy_instance_ptr == NULL) { - status = CELIX_BUNDLE_EXCEPTION; - } - } - - if (status == CELIX_SUCCESS) { - if (proxy_instance_ptr->registration_ptr) { - status = serviceRegistration_unregister(proxy_instance_ptr->registration_ptr); - proxy_instance_ptr->properties = NULL; - } - if (proxy_instance_ptr->service) { - status = remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle, proxy_instance_ptr->service); - } - if (proxy_instance_ptr->properties) { - properties_destroy(proxy_instance_ptr->properties); - } - free(proxy_instance_ptr); - } - - return status; -} - - http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h b/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h deleted file mode 100644 index e8a5e1f..0000000 --- a/remote_services/remote_service_admin_common/src/remote_service_admin_impl.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - *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. - */ -/* - * remote_service_admin_impl.h - * - * \date Dec 5, 2013 - * \author Apache Celix Project Team - * \copyright Apache License, Version 2.0 - */ - -#ifndef REMOTE_SERVICE_ADMIN_IMPL_H_ -#define REMOTE_SERVICE_ADMIN_IMPL_H_ - -#include "remote_service_admin.h" - -#define BUNDLE_STORE_PROPERTY_NAME "ENDPOINTS" -#define DEFAULT_BUNDLE_STORE "endpoints" - -celix_status_t remoteServiceAdmin_create(bundle_context_pt context, remote_service_admin_pt *admin); -celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin); - -celix_status_t remoteServiceAdmin_send(remote_service_admin_pt rsa, endpoint_description_pt endpointDescription, char *methodSignature, char **reply, int* replyStatus); - -celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations); -celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration); -celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt admin, array_list_pt *services); -celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt admin, array_list_pt *services); -celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, endpoint_description_pt endpoint, import_registration_pt *registration); -celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, import_registration_pt registration); - -celix_status_t remoteServiceAdmin_destroyEndpointDescription(endpoint_description_pt *description); - -#endif /* REMOTE_SERVICE_ADMIN_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/remote_services_api/CMakeLists.txt b/remote_services/remote_services_api/CMakeLists.txt new file mode 100644 index 0000000..67656d3 --- /dev/null +++ b/remote_services/remote_services_api/CMakeLists.txt @@ -0,0 +1,28 @@ +# 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. + +add_library(celix_remote_services_api INTERFACE) +target_include_directories(celix_remote_services_api INTERFACE + $ + $ +) + +install(TARGETS celix_remote_services_api EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa) +install(DIRECTORY include/ DESTINATION include/celix/remote_services COMPONENT rsa) + +#Setup target aliases to match external usage +add_library(Celix::remote_services_api ALIAS celix_remote_services_api) http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/README.md ---------------------------------------------------------------------- diff --git a/remote_services/remote_services_api/README.md b/remote_services/remote_services_api/README.md new file mode 100644 index 0000000..2e3d268 --- /dev/null +++ b/remote_services/remote_services_api/README.md @@ -0,0 +1,11 @@ +# Remote Service Admin + +The Remote Service Admin (RSA) provides the mechanisms to import and export services when instructed to do so by the Topology Manager. + +To delegate method calls to the actual service implementation, the RSA_SHM and the RSA_HTTP are using "endpoint/proxy" bundles, which has all the knowledge about the marshalling and unmarshalling of data for the service. The RSA_DFI implementation combines a [foreign function interface](https://en.wikipedia.org/wiki/Foreign_function_interface) technique together with manualy created descriptors. + +Note that this folder contains code commonly used by the RSA implementations and therefore does not include any CMAKE configuration. + +## Properties + ENDPOINTS defines the relative directory where endpoints and proxys can be found (default: endpoints) + CELIX_FRAMEWORK_EXTENDER_PATH Used in RSA_DFI only. Can be used to define a path to use as an extender path point for the framework bundle. For normal bundles the bundle cache is used. http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/remote_services_api/include/remote_constants.h ---------------------------------------------------------------------- diff --git a/remote_services/remote_services_api/include/remote_constants.h b/remote_services/remote_services_api/include/remote_constants.h new file mode 100644 index 0000000..277f837 --- /dev/null +++ b/remote_services/remote_services_api/include/remote_constants.h @@ -0,0 +1,31 @@ +/** + *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 REMOTE_CONSTANTS_H_ +#define REMOTE_CONSTANTS_H_ + +static const char * const OSGI_RSA_SERVICE_EXPORTED_INTERFACES = "service.exported.interfaces"; +static const char * const OSGI_RSA_ENDPOINT_FRAMEWORK_UUID = "endpoint.framework.uuid"; +static const char * const OSGI_RSA_ENDPOINT_SERVICE_ID = "endpoint.service.id"; +static const char * const OSGI_RSA_ENDPOINT_ID = "endpoint.id"; +static const char * const OSGI_RSA_SERVICE_IMPORTED = "service.imported"; +static const char * const OSGI_RSA_SERVICE_IMPORTED_CONFIGS = "service.imported.configs"; +static const char * const OSGI_RSA_SERVICE_LOCATION = "service.location"; + +#endif /* REMOTE_CONSTANTS_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/CMakeLists.txt b/remote_services/rsa_common/CMakeLists.txt new file mode 100644 index 0000000..27c2dba --- /dev/null +++ b/remote_services/rsa_common/CMakeLists.txt @@ -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. + +add_library(celix_rsa_common STATIC + src/endpoint_description.c + src/export_registration_impl.c + src/import_registration_impl.c +) +target_include_directories(celix_rsa_common PRIVATE src) +target_link_libraries(celix_rsa_common PUBLIC Celix::framework Celix::rsa_spi Celix::log_helper) + +install(TARGETS celix_rsa_common EXPORT celix COMPONENT rsa DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +#Setup target aliases to match external usage +add_library(Celix::rsa_common ALIAS celix_rsa_common) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/endpoint_description.c ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/endpoint_description.c b/remote_services/rsa_common/src/endpoint_description.c new file mode 100644 index 0000000..0d8b684 --- /dev/null +++ b/remote_services/rsa_common/src/endpoint_description.c @@ -0,0 +1,89 @@ +/** + *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. + */ +/* + * endpoint_description.c + * + * \date 25 Jul 2014 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include +#include + +#include "celix_errno.h" +#include "celix_log.h" + +#include "endpoint_description.h" +#include "remote_constants.h" +#include "constants.h" + +static celix_status_t endpointDescription_verifyLongProperty(properties_pt properties, char *propertyName, unsigned long *longProperty); + +celix_status_t endpointDescription_create(properties_pt properties, endpoint_description_pt *endpointDescription) { + celix_status_t status = CELIX_SUCCESS; + + unsigned long serviceId = 0UL; + status = endpointDescription_verifyLongProperty(properties, (char *) OSGI_RSA_ENDPOINT_SERVICE_ID, &serviceId); + if (status != CELIX_SUCCESS) { + return status; + } + + endpoint_description_pt ep = calloc(1,sizeof(*ep)); + + ep->properties = properties; + ep->frameworkUUID = (char*)properties_get(properties, OSGI_RSA_ENDPOINT_FRAMEWORK_UUID); + ep->id = (char*)properties_get(properties, OSGI_RSA_ENDPOINT_ID); + ep->service = strndup(properties_get(properties, OSGI_FRAMEWORK_OBJECTCLASS), 1024*10); + ep->serviceId = serviceId; + + if (!(ep->frameworkUUID) || !(ep->id) || !(ep->service) ) { + fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR, "ENDPOINT_DESCRIPTION: incomplete description!."); + status = CELIX_BUNDLE_EXCEPTION; + } + + if(status == CELIX_SUCCESS){ + *endpointDescription = ep; + } + else{ + *endpointDescription = NULL; + free(ep); + } + + return status; +} + +celix_status_t endpointDescription_destroy(endpoint_description_pt description) { + properties_destroy(description->properties); + free(description->service); + free(description); + return CELIX_SUCCESS; +} + +static celix_status_t endpointDescription_verifyLongProperty(properties_pt properties, char *propertyName, unsigned long *longProperty) { + celix_status_t status = CELIX_SUCCESS; + + const char *value = properties_get(properties, propertyName); + if (value == NULL) { + *longProperty = 0UL; + } else { + *longProperty = strtoul(value,NULL,10); + } + + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/export_registration_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/export_registration_impl.c b/remote_services/rsa_common/src/export_registration_impl.c new file mode 100644 index 0000000..1c684e7 --- /dev/null +++ b/remote_services/rsa_common/src/export_registration_impl.c @@ -0,0 +1,257 @@ +/** + *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. + */ +/* + * export_registration_impl.c + * + * \date Oct 6, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ +#include + +#include "constants.h" + +#include "celix_errno.h" + +#include "export_registration_impl.h" +#include "remote_service_admin_impl.h" + + +struct export_reference { + endpoint_description_pt endpoint; + service_reference_pt reference; +}; + +celix_status_t exportRegistration_endpointAdding(void * handle, service_reference_pt reference, void **service); +celix_status_t exportRegistration_endpointAdded(void * handle, service_reference_pt reference, void *service); +celix_status_t exportRegistration_endpointModified(void * handle, service_reference_pt reference, void *service); +celix_status_t exportRegistration_endpointRemoved(void * handle, service_reference_pt reference, void *service); + +celix_status_t exportRegistration_createEndpointTracker(export_registration_pt registration, service_tracker_pt *tracker); + +celix_status_t exportRegistration_create(log_helper_pt helper, service_reference_pt reference, endpoint_description_pt endpoint, remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt *registration) { + celix_status_t status = CELIX_SUCCESS; + + *registration = calloc(1, sizeof(**registration)); + if (!*registration) { + status = CELIX_ENOMEM; + } else { + (*registration)->context = context; + (*registration)->closed = false; + (*registration)->endpointDescription = endpoint; + (*registration)->reference = reference; + (*registration)->rsa = rsa; + (*registration)->tracker = NULL; + (*registration)->endpoint = NULL; + (*registration)->endpointTracker = NULL; + (*registration)->exportReference = NULL; + (*registration)->bundle = NULL; + (*registration)->loghelper = helper; + } + + return status; +} + +celix_status_t exportRegistration_destroy(export_registration_pt *registration) { + celix_status_t status = CELIX_SUCCESS; + + remoteServiceAdmin_destroyEndpointDescription(&(*registration)->endpointDescription); + free(*registration); + + return status; +} + +celix_status_t exportRegistration_startTracking(export_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + + if (registration->endpointTracker == NULL) { + status = exportRegistration_createEndpointTracker(registration, ®istration->endpointTracker); + if (status == CELIX_SUCCESS) { + status = serviceTracker_open(registration->endpointTracker); + } + } + + return status; +} + +celix_status_t exportRegistration_stopTracking(export_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + + if (registration->endpointTracker != NULL) { + status = serviceTracker_close(registration->endpointTracker); + if (status != CELIX_SUCCESS) { + logHelper_log(registration->loghelper, OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close endpoint tracker"); + } + else { + status = serviceTracker_destroy(registration->endpointTracker); + } + } + if (registration->tracker != NULL) { + status = serviceTracker_close(registration->tracker); + if (status != CELIX_SUCCESS) { + logHelper_log(registration->loghelper, OSGI_LOGSERVICE_ERROR, "EXPORT_REGISTRATION: Could not close service tracker"); + } + else { + status = serviceTracker_destroy(registration->tracker); + } + } + + return status; +} + +celix_status_t exportRegistration_createEndpointTracker(export_registration_pt registration, service_tracker_pt *tracker) { + celix_status_t status; + + service_tracker_customizer_pt customizer = NULL; + + status = serviceTrackerCustomizer_create(registration, exportRegistration_endpointAdding, + exportRegistration_endpointAdded, exportRegistration_endpointModified, exportRegistration_endpointRemoved, &customizer); + + if (status == CELIX_SUCCESS) { + char filter[512]; + + snprintf(filter, 512, "(&(%s=%s)(remote.interface=%s))", (char*) OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_ENDPOINT, registration->endpointDescription->service); + status = serviceTracker_createWithFilter(registration->context, filter, customizer, tracker); + } + + return status; +} + +celix_status_t exportRegistration_endpointAdding(void * handle, service_reference_pt reference, void **service) { + celix_status_t status; + export_registration_pt registration = handle; + + status = bundleContext_getService(registration->context, reference, service); + + return status; +} + +celix_status_t exportRegistration_endpointAdded(void * handle, service_reference_pt reference, void *endpoint_service) { + celix_status_t status = CELIX_SUCCESS; + export_registration_pt registration = handle; + + remote_endpoint_service_pt endpoint = endpoint_service; + if (registration->endpoint == NULL) { + registration->endpoint = endpoint; + void *service = NULL; + status = bundleContext_getService(registration->context, registration->reference, &service); + if (status == CELIX_SUCCESS) { + endpoint->setService(endpoint->endpoint, service); + } + } + + return status; +} + +celix_status_t exportRegistration_endpointModified(void * handle, service_reference_pt reference, void *service) { + celix_status_t status = CELIX_SUCCESS; + + return status; +} + +celix_status_t exportRegistration_endpointRemoved(void * handle, service_reference_pt reference, void *service) { + celix_status_t status = CELIX_SUCCESS; + export_registration_pt registration = handle; + + remote_endpoint_service_pt endpoint = service; + if (registration->endpoint != NULL) { + endpoint->setService(endpoint->endpoint, NULL); + } + + return status; +} + +celix_status_t exportRegistration_open(export_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + const char *bundleStore = NULL; + + bundleContext_getProperty(registration->context, BUNDLE_STORE_PROPERTY_NAME, &bundleStore); + + if (bundleStore == NULL) { + bundleStore = DEFAULT_BUNDLE_STORE; + } + char name[256]; + + snprintf(name, 256, "%s/%s_endpoint.zip", bundleStore, registration->endpointDescription->service); + + status = bundleContext_installBundle(registration->context, name, ®istration->bundle); + if (status == CELIX_SUCCESS) { + status = bundle_start(registration->bundle); + if (status == CELIX_SUCCESS) { + } + } + + return status; +} + +celix_status_t exportRegistration_close(export_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + + exportRegistration_stopTracking(registration); + + bundle_uninstall(registration->bundle); + + + return status; +} + +celix_status_t exportRegistration_getException(export_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + return status; +} + +celix_status_t exportRegistration_getExportReference(export_registration_pt registration, export_reference_pt *reference) { + celix_status_t status = CELIX_SUCCESS; + + registration->exportReference = calloc(1, sizeof(*registration->exportReference)); + + if (registration->exportReference == NULL) { + status = CELIX_ENOMEM; + } else { + registration->exportReference->endpoint = registration->endpointDescription; + registration->exportReference->reference = registration->reference; + } + + *reference = registration->exportReference; + + return status; +} + +celix_status_t exportRegistration_setEndpointDescription(export_registration_pt registration, endpoint_description_pt endpointDescription) { + celix_status_t status = CELIX_SUCCESS; + + registration->endpointDescription = endpointDescription; + + return status; +} + +celix_status_t exportReference_getExportedEndpoint(export_reference_pt reference, endpoint_description_pt *endpoint) { + celix_status_t status = CELIX_SUCCESS; + + *endpoint = reference->endpoint; + + return status; +} + +celix_status_t exportReference_getExportedService(export_reference_pt reference, service_reference_pt *service) { + celix_status_t status = CELIX_SUCCESS; + *service = reference->reference; + return status; +} + http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/export_registration_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/export_registration_impl.h b/remote_services/rsa_common/src/export_registration_impl.h new file mode 100644 index 0000000..bb276f9 --- /dev/null +++ b/remote_services/rsa_common/src/export_registration_impl.h @@ -0,0 +1,61 @@ +/** + *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. + */ +/* + * export_registration_impl.h + * + * \date Oct 6, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef EXPORT_REGISTRATION_IMPL_H_ +#define EXPORT_REGISTRATION_IMPL_H_ + +#include "remote_service_admin.h" +#include "remote_endpoint.h" +#include "service_tracker.h" +#include "log_helper.h" + +struct export_registration { + bundle_context_pt context; + remote_service_admin_pt rsa; + endpoint_description_pt endpointDescription; + service_reference_pt reference; + log_helper_pt loghelper; + + service_tracker_pt tracker; + service_tracker_pt endpointTracker; + + remote_endpoint_service_pt endpoint; + + export_reference_pt exportReference; + bundle_pt bundle; + + bool closed; +}; + +celix_status_t exportRegistration_create(log_helper_pt helper, service_reference_pt reference, endpoint_description_pt endpoint, remote_service_admin_pt rsa, bundle_context_pt context, export_registration_pt *registration); +celix_status_t exportRegistration_destroy(export_registration_pt *registration); +celix_status_t exportRegistration_open(export_registration_pt registration); + +celix_status_t exportRegistration_setEndpointDescription(export_registration_pt registration, endpoint_description_pt endpointDescription); +celix_status_t exportRegistration_startTracking(export_registration_pt registration); +celix_status_t exportRegistration_stopTracking(export_registration_pt registration); + +#endif /* EXPORT_REGISTRATION_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/import_registration_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/import_registration_impl.c b/remote_services/rsa_common/src/import_registration_impl.c new file mode 100644 index 0000000..9a84327 --- /dev/null +++ b/remote_services/rsa_common/src/import_registration_impl.c @@ -0,0 +1,274 @@ +/** + *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. + */ +/* + * import_registration_impl.c + * + * \date Oct 14, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#include +#include + +#include + +#include "celix_errno.h" + +#include "import_registration_impl.h" +#include "remote_service_admin_impl.h" + +struct import_reference { + endpoint_description_pt endpoint; + service_reference_pt reference; +}; + + + +celix_status_t importRegistration_proxyFactoryAdding(void * handle, service_reference_pt reference, void **service); +celix_status_t importRegistration_proxyFactoryAdded(void * handle, service_reference_pt reference, void *service); +celix_status_t importRegistration_proxyFactoryModified(void * handle, service_reference_pt reference, void *service); +celix_status_t importRegistration_proxyFactoryRemoved(void * handle, service_reference_pt reference, void *service); + +celix_status_t importRegistration_create(endpoint_description_pt endpoint, remote_service_admin_pt rsa, sendToHandle sendToCallback, bundle_context_pt context, import_registration_pt *registration) { + celix_status_t status = CELIX_SUCCESS; + + *registration = calloc(1, sizeof(**registration)); + if (!*registration) { + status = CELIX_ENOMEM; + } else { + (*registration)->context = context; + (*registration)->closed = false; + (*registration)->endpointDescription = endpoint; + (*registration)->rsa = rsa; + (*registration)->sendToCallback = sendToCallback; + (*registration)->reference = NULL; + (*registration)->importReference = NULL; + } + + return status; +} + +celix_status_t importRegistration_destroy(import_registration_pt registration) +{ + free(registration); + + return CELIX_SUCCESS; +} + + +celix_status_t importRegistrationFactory_create(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory) { + celix_status_t status = CELIX_SUCCESS; + + *registration_factory = calloc(1, sizeof(**registration_factory)); + if (!*registration_factory) { + status = CELIX_ENOMEM; + } else { + (*registration_factory)->serviceName = strdup(serviceName); + (*registration_factory)->context = context; + (*registration_factory)->bundle = NULL; + (*registration_factory)->loghelper = helper; + + arrayList_create(&(*registration_factory)->registrations); + } + + return status; +} + + + +celix_status_t importRegistrationFactory_destroy(import_registration_factory_pt* registration_factory) { + celix_status_t status = CELIX_SUCCESS; + + if (*registration_factory != NULL) + { + free((*registration_factory)->serviceName); + arrayList_destroy((*registration_factory)->registrations); + + serviceTracker_destroy((*registration_factory)->proxyFactoryTracker); + free(*registration_factory); + + *registration_factory = NULL; + } + + + return status; +} + + +celix_status_t importRegistrationFactory_open(import_registration_factory_pt registration_factory) +{ + celix_status_t status; + + const char *bundleStore = NULL; + bundleContext_getProperty(registration_factory->context, BUNDLE_STORE_PROPERTY_NAME, &bundleStore); + + if (bundleStore == NULL) { + bundleStore = DEFAULT_BUNDLE_STORE; + } + + char name[256]; + snprintf(name, 256, "%s/%s_proxy.zip", bundleStore, registration_factory->serviceName); + + status = bundleContext_installBundle(registration_factory->context, name, ®istration_factory->bundle); + + if (status == CELIX_SUCCESS) { + status = bundle_start(registration_factory->bundle); + if (status == CELIX_SUCCESS) { + logHelper_log(registration_factory->loghelper, OSGI_LOGSERVICE_INFO, "%s successfully started.", name); + } + } + else { + logHelper_log(registration_factory->loghelper, OSGI_LOGSERVICE_ERROR, "%s could not be installed.", name); + } + + return status; +} + +celix_status_t importRegistrationFactory_close(import_registration_factory_pt registration_factory) +{ + celix_status_t status = CELIX_SUCCESS; + + + if (registration_factory->proxyFactoryTracker != NULL) { + serviceTracker_close(registration_factory->proxyFactoryTracker); + } + + if (registration_factory->bundle != NULL) { + bundle_uninstall(registration_factory->bundle); + } + + return status; +} + + +celix_status_t importRegistration_createProxyFactoryTracker(import_registration_factory_pt registration_factory, service_tracker_pt *tracker) { + celix_status_t status; + service_tracker_customizer_pt customizer = NULL; + + status = serviceTrackerCustomizer_create(registration_factory, importRegistration_proxyFactoryAdding, importRegistration_proxyFactoryAdded, importRegistration_proxyFactoryModified, importRegistration_proxyFactoryRemoved, &customizer); + + if (status == CELIX_SUCCESS) { + char filter[512]; + + snprintf(filter, 512, "(&(%s=%s)(proxy.interface=%s))", (char*) OSGI_FRAMEWORK_OBJECTCLASS, (char*) OSGI_RSA_REMOTE_PROXY_FACTORY, registration_factory->serviceName); + status = serviceTracker_createWithFilter(registration_factory->context, filter, customizer, tracker); + + if (status == CELIX_SUCCESS) + { + serviceTracker_open(*tracker); + } + } + + return status; +} + +celix_status_t importRegistration_proxyFactoryAdding(void * handle, service_reference_pt reference, void **service) { + celix_status_t status = CELIX_SUCCESS; + import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; + + bundleContext_getService(registration_factory->context, reference, service); + + return status; +} + +celix_status_t importRegistration_proxyFactoryAdded(void * handle, service_reference_pt reference, void *service) { + celix_status_t status = CELIX_SUCCESS; + + import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; + registration_factory->trackedFactory = (remote_proxy_factory_service_pt) service; + + return status; +} + +celix_status_t importRegistration_proxyFactoryModified(void * handle, service_reference_pt reference, void *service) { + celix_status_t status = CELIX_SUCCESS; + + return status; +} + +celix_status_t importRegistration_proxyFactoryRemoved(void * handle, service_reference_pt reference, void *service) { + celix_status_t status = CELIX_SUCCESS; + + import_registration_factory_pt registration_factory = (import_registration_factory_pt) handle; + registration_factory->trackedFactory = NULL; + + return status; +} + + + +celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory) +{ + celix_status_t status; + + if ( (status = importRegistrationFactory_create(helper, serviceName, context, registration_factory)) == CELIX_SUCCESS) { + // starting the proxy tracker first allows us to pick up already available proxy factories + importRegistration_createProxyFactoryTracker(*registration_factory, &((*registration_factory)->proxyFactoryTracker)); + logHelper_log((*registration_factory)->loghelper, OSGI_LOGSERVICE_INFO, "remoteServiceAdmin_importService: new registration_factory added for %s at %p", serviceName, (*registration_factory)->proxyFactoryTracker); + + // check whether factory is available + if (((*registration_factory)->trackedFactory == NULL) && ((status = importRegistrationFactory_open(*registration_factory)) != CELIX_SUCCESS)) { + logHelper_log((*registration_factory)->loghelper, OSGI_LOGSERVICE_ERROR, "remoteServiceAdmin_importService: cannot open registration_factory for %s.", serviceName); + + importRegistrationFactory_close(*registration_factory); + importRegistrationFactory_destroy(registration_factory); + } + } + + return status; +} + + + + +celix_status_t importRegistration_getException(import_registration_pt registration) { + celix_status_t status = CELIX_SUCCESS; + return status; +} + + +celix_status_t importRegistration_getImportReference(import_registration_pt registration, import_reference_pt *reference) { + celix_status_t status = CELIX_SUCCESS; + + if (registration->importReference == NULL) { + registration->importReference = calloc(1, sizeof(*registration->importReference)); + if (registration->importReference == NULL) { + status = CELIX_ENOMEM; + } else { + registration->importReference->endpoint = registration->endpointDescription; + registration->importReference->reference = registration->reference; + } + } + + *reference = registration->importReference; + + return status; +} + + +celix_status_t importReference_getImportedEndpoint(import_reference_pt reference) { + celix_status_t status = CELIX_SUCCESS; + return status; +} + +celix_status_t importReference_getImportedService(import_reference_pt reference) { + celix_status_t status = CELIX_SUCCESS; + return status; +} http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/import_registration_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/import_registration_impl.h b/remote_services/rsa_common/src/import_registration_impl.h new file mode 100644 index 0000000..7aa397f --- /dev/null +++ b/remote_services/rsa_common/src/import_registration_impl.h @@ -0,0 +1,81 @@ +/** + *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. + */ +/* + * import_registration_impl.h + * + * \date Oct 14, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef IMPORT_REGISTRATION_IMPL_H_ +#define IMPORT_REGISTRATION_IMPL_H_ + +#include "remote_service_admin.h" +#include "remote_proxy.h" +#include "service_tracker.h" +#include "log_helper.h" + +struct import_registration { + bundle_context_pt context; + endpoint_description_pt endpointDescription; + + service_reference_pt reference; + import_reference_pt importReference; + + remote_service_admin_pt rsa; + sendToHandle sendToCallback; + + bool closed; +}; + + + +struct import_registration_factory +{ + char* serviceName; + log_helper_pt loghelper; + remote_proxy_factory_service_pt trackedFactory; + service_tracker_pt proxyFactoryTracker; + bundle_context_pt context; + array_list_pt registrations; + bundle_pt bundle; +}; + + +celix_status_t importRegistration_create(endpoint_description_pt endpoint, remote_service_admin_pt rsa, sendToHandle callback, bundle_context_pt context, import_registration_pt *registration); +celix_status_t importRegistration_destroy(import_registration_pt registration); + +celix_status_t importRegistration_setEndpointDescription(import_registration_pt registration, endpoint_description_pt endpointDescription); +celix_status_t importRegistration_setHandler(import_registration_pt registration, void * handler); +celix_status_t importRegistration_setCallback(import_registration_pt registration, sendToHandle callback); + +celix_status_t importRegistration_getException(import_registration_pt registration); +celix_status_t importRegistration_getImportReference(import_registration_pt registration, import_reference_pt *reference); + +celix_status_t importRegistration_createProxyFactoryTracker(import_registration_factory_pt registration_factory, service_tracker_pt *tracker); + +celix_status_t importRegistrationFactory_destroy(import_registration_factory_pt* registration_factory); +//celix_status_t importRegistrationFactory_open(import_registration_factory_pt registration_factory); +celix_status_t importRegistrationFactory_close(import_registration_factory_pt registration_factory); +celix_status_t importRegistrationFactory_install(log_helper_pt helper, char* serviceName, bundle_context_pt context, import_registration_factory_pt *registration_factory); + + + +#endif /* IMPORT_REGISTRATION_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/remote_proxy_factory_impl.c ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/remote_proxy_factory_impl.c b/remote_services/rsa_common/src/remote_proxy_factory_impl.c new file mode 100644 index 0000000..9f996d6 --- /dev/null +++ b/remote_services/rsa_common/src/remote_proxy_factory_impl.c @@ -0,0 +1,252 @@ +/** + * 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. + */ + +/* + * remote_proxy_factory_impl.c + * + * \date 22 Dec 2014 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#include +#include + +#include "remote_proxy.h" + +typedef struct proxy_instance { + service_registration_pt registration_ptr; + void *service; + properties_pt properties; +} *proxy_instance_pt; + +static celix_status_t remoteProxyFactory_registerProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, remote_service_admin_pt rsa, sendToHandle sendToCallback); +static celix_status_t remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription); + +celix_status_t remoteProxyFactory_create(bundle_context_pt context, char *service, void *handle, + createProxyService create, destroyProxyService destroy, + remote_proxy_factory_pt *remote_proxy_factory_ptr) { + celix_status_t status = CELIX_SUCCESS; + + *remote_proxy_factory_ptr = calloc(1, sizeof(**remote_proxy_factory_ptr)); + if (!*remote_proxy_factory_ptr) { + status = CELIX_ENOMEM; + } + + if (status == CELIX_SUCCESS) { + (*remote_proxy_factory_ptr)->context_ptr = context; + (*remote_proxy_factory_ptr)->service = strdup(service); + + (*remote_proxy_factory_ptr)->remote_proxy_factory_service_ptr = NULL; + (*remote_proxy_factory_ptr)->properties = NULL; + (*remote_proxy_factory_ptr)->registration = NULL; + + (*remote_proxy_factory_ptr)->proxy_instances = hashMap_create(NULL, NULL, NULL, NULL); + + (*remote_proxy_factory_ptr)->handle = handle; + + (*remote_proxy_factory_ptr)->create_proxy_service_ptr = create; + (*remote_proxy_factory_ptr)->destroy_proxy_service_ptr = destroy; + } + + return status; +} + +celix_status_t remoteProxyFactory_destroy(remote_proxy_factory_pt *remote_proxy_factory_ptr) { + celix_status_t status = CELIX_SUCCESS; + + if (!*remote_proxy_factory_ptr) { + status = CELIX_ILLEGAL_ARGUMENT; + } + + if (status == CELIX_SUCCESS) { + if ((*remote_proxy_factory_ptr)->proxy_instances) { + hashMap_destroy((*remote_proxy_factory_ptr)->proxy_instances, false, false); + (*remote_proxy_factory_ptr)->proxy_instances = NULL; + } + if ((*remote_proxy_factory_ptr)->service) { + free((*remote_proxy_factory_ptr)->service); + (*remote_proxy_factory_ptr)->service = NULL; + } + free(*remote_proxy_factory_ptr); + *remote_proxy_factory_ptr = NULL; + } + + return status; +} + +celix_status_t remoteProxyFactory_register(remote_proxy_factory_pt remote_proxy_factory_ptr) { + celix_status_t status = CELIX_SUCCESS; + + remote_proxy_factory_ptr->remote_proxy_factory_service_ptr = calloc(1, sizeof(*remote_proxy_factory_ptr->remote_proxy_factory_service_ptr)); + if (!remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) { + status = CELIX_ENOMEM; + } + + if (status == CELIX_SUCCESS) { + remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->factory = remote_proxy_factory_ptr; + remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->registerProxyService = remoteProxyFactory_registerProxyService; + remote_proxy_factory_ptr->remote_proxy_factory_service_ptr->unregisterProxyService = remoteProxyFactory_unregisterProxyService; + + remote_proxy_factory_ptr->properties = properties_create(); + if (!remote_proxy_factory_ptr->properties) { + status = CELIX_BUNDLE_EXCEPTION; + } else { + properties_set(remote_proxy_factory_ptr->properties, "proxy.interface", remote_proxy_factory_ptr->service); + } + } + + if (status == CELIX_SUCCESS) { + status = bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, OSGI_RSA_REMOTE_PROXY_FACTORY, + remote_proxy_factory_ptr->remote_proxy_factory_service_ptr, remote_proxy_factory_ptr->properties, &remote_proxy_factory_ptr->registration); + } + + return status; +} + +celix_status_t remoteProxyFactory_unregister(remote_proxy_factory_pt remote_proxy_factory_ptr) { + celix_status_t status = CELIX_SUCCESS; + + if (!remote_proxy_factory_ptr) { + status = CELIX_ILLEGAL_ARGUMENT; + } + + // #TODO Remove proxy registrations + if (status == CELIX_SUCCESS) { + + hash_map_iterator_pt iter = hashMapIterator_create(remote_proxy_factory_ptr->proxy_instances); + while(hashMapIterator_hasNext(iter)){ + proxy_instance_pt proxy_instance_ptr = (proxy_instance_pt)hashMapIterator_nextValue(iter); + + if (proxy_instance_ptr->service) { + remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle, proxy_instance_ptr->service); + } + free(proxy_instance_ptr); + } + hashMapIterator_destroy(iter); + + if (remote_proxy_factory_ptr->registration) { + status = serviceRegistration_unregister(remote_proxy_factory_ptr->registration); + remote_proxy_factory_ptr->properties = NULL; + } + if (remote_proxy_factory_ptr->properties) { + properties_destroy(remote_proxy_factory_ptr->properties); + } + if (remote_proxy_factory_ptr->remote_proxy_factory_service_ptr) { + free(remote_proxy_factory_ptr->remote_proxy_factory_service_ptr); + } + } + + return status; +} + + +static celix_status_t remoteProxyFactory_registerProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription, remote_service_admin_pt rsa, sendToHandle sendToCallback) { + celix_status_t status = CELIX_SUCCESS; + proxy_instance_pt proxy_instance_ptr = NULL; + + if (!remote_proxy_factory_ptr || !remote_proxy_factory_ptr->create_proxy_service_ptr) { + status = CELIX_ILLEGAL_ARGUMENT; + } + + if (status == CELIX_SUCCESS) { + proxy_instance_ptr = calloc(1, sizeof(*proxy_instance_ptr)); + if (!proxy_instance_ptr) { + status = CELIX_ENOMEM; + } + } + + if (status == CELIX_SUCCESS) { + proxy_instance_ptr->properties = properties_create(); + if (!proxy_instance_ptr->properties) { + status = CELIX_ENOMEM; + } + } + + if (status == CELIX_SUCCESS) { + status = remote_proxy_factory_ptr->create_proxy_service_ptr(remote_proxy_factory_ptr->handle, endpointDescription, rsa, sendToCallback, proxy_instance_ptr->properties, &proxy_instance_ptr->service); + } + + if (status == CELIX_SUCCESS) { + properties_set(proxy_instance_ptr->properties, "proxy.interface", remote_proxy_factory_ptr->service); + + hash_map_iterator_pt iter = hashMapIterator_create(endpointDescription->properties); + while (hashMapIterator_hasNext(iter)) { + hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); + char *key = hashMapEntry_getKey(entry); + char *value = hashMapEntry_getValue(entry); + + properties_set(proxy_instance_ptr->properties, key, value); + } + hashMapIterator_destroy(iter); + } + + if (status == CELIX_SUCCESS) { + status = bundleContext_registerService(remote_proxy_factory_ptr->context_ptr, remote_proxy_factory_ptr->service, proxy_instance_ptr->service, proxy_instance_ptr->properties, &proxy_instance_ptr->registration_ptr); + } + + if (status == CELIX_SUCCESS) { + hashMap_put(remote_proxy_factory_ptr->proxy_instances, endpointDescription, proxy_instance_ptr); + } + + if(status!=CELIX_SUCCESS){ + if(proxy_instance_ptr != NULL){ + if(proxy_instance_ptr->properties != NULL){ + properties_destroy(proxy_instance_ptr->properties); + } + free(proxy_instance_ptr); + } + } + + return status; +} + +static celix_status_t remoteProxyFactory_unregisterProxyService(remote_proxy_factory_pt remote_proxy_factory_ptr, endpoint_description_pt endpointDescription) { + celix_status_t status = CELIX_SUCCESS; + proxy_instance_pt proxy_instance_ptr = NULL; + + if (!remote_proxy_factory_ptr || !endpointDescription || !remote_proxy_factory_ptr->proxy_instances || !remote_proxy_factory_ptr->handle) { + status = CELIX_ILLEGAL_ARGUMENT; + } + + if (status == CELIX_SUCCESS) { + proxy_instance_ptr = hashMap_remove(remote_proxy_factory_ptr->proxy_instances, endpointDescription); + if (proxy_instance_ptr == NULL) { + status = CELIX_BUNDLE_EXCEPTION; + } + } + + if (status == CELIX_SUCCESS) { + if (proxy_instance_ptr->registration_ptr) { + status = serviceRegistration_unregister(proxy_instance_ptr->registration_ptr); + proxy_instance_ptr->properties = NULL; + } + if (proxy_instance_ptr->service) { + status = remote_proxy_factory_ptr->destroy_proxy_service_ptr(remote_proxy_factory_ptr->handle, proxy_instance_ptr->service); + } + if (proxy_instance_ptr->properties) { + properties_destroy(proxy_instance_ptr->properties); + } + free(proxy_instance_ptr); + } + + return status; +} + + http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_common/src/remote_service_admin_impl.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_common/src/remote_service_admin_impl.h b/remote_services/rsa_common/src/remote_service_admin_impl.h new file mode 100644 index 0000000..e8a5e1f --- /dev/null +++ b/remote_services/rsa_common/src/remote_service_admin_impl.h @@ -0,0 +1,49 @@ +/** + *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. + */ +/* + * remote_service_admin_impl.h + * + * \date Dec 5, 2013 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef REMOTE_SERVICE_ADMIN_IMPL_H_ +#define REMOTE_SERVICE_ADMIN_IMPL_H_ + +#include "remote_service_admin.h" + +#define BUNDLE_STORE_PROPERTY_NAME "ENDPOINTS" +#define DEFAULT_BUNDLE_STORE "endpoints" + +celix_status_t remoteServiceAdmin_create(bundle_context_pt context, remote_service_admin_pt *admin); +celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin); + +celix_status_t remoteServiceAdmin_send(remote_service_admin_pt rsa, endpoint_description_pt endpointDescription, char *methodSignature, char **reply, int* replyStatus); + +celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations); +celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration); +celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt admin, array_list_pt *services); +celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt admin, array_list_pt *services); +celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, endpoint_description_pt endpoint, import_registration_pt *registration); +celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, import_registration_pt registration); + +celix_status_t remoteServiceAdmin_destroyEndpointDescription(endpoint_description_pt *description); + +#endif /* REMOTE_SERVICE_ADMIN_IMPL_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/CMakeLists.txt b/remote_services/rsa_spi/CMakeLists.txt new file mode 100644 index 0000000..ea4ec95 --- /dev/null +++ b/remote_services/rsa_spi/CMakeLists.txt @@ -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. + +add_library(rsa_spi INTERFACE) +target_include_directories(rsa_spi INTERFACE + $ + $ +) +target_link_libraries(rsa_spi INTERFACE Celix::remote_services_api) + +install(TARGETS rsa_spi EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT rsa) +install(DIRECTORY include/ DESTINATION include/celix/rsa COMPONENT rsa) + +#Setup target aliases to match external usage +add_library(Celix::rsa_spi ALIAS rsa_spi) http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/README.md ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/README.md b/remote_services/rsa_spi/README.md new file mode 100644 index 0000000..2e3d268 --- /dev/null +++ b/remote_services/rsa_spi/README.md @@ -0,0 +1,11 @@ +# Remote Service Admin + +The Remote Service Admin (RSA) provides the mechanisms to import and export services when instructed to do so by the Topology Manager. + +To delegate method calls to the actual service implementation, the RSA_SHM and the RSA_HTTP are using "endpoint/proxy" bundles, which has all the knowledge about the marshalling and unmarshalling of data for the service. The RSA_DFI implementation combines a [foreign function interface](https://en.wikipedia.org/wiki/Foreign_function_interface) technique together with manualy created descriptors. + +Note that this folder contains code commonly used by the RSA implementations and therefore does not include any CMAKE configuration. + +## Properties + ENDPOINTS defines the relative directory where endpoints and proxys can be found (default: endpoints) + CELIX_FRAMEWORK_EXTENDER_PATH Used in RSA_DFI only. Can be used to define a path to use as an extender path point for the framework bundle. For normal bundles the bundle cache is used. http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/endpoint_description.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/include/endpoint_description.h b/remote_services/rsa_spi/include/endpoint_description.h new file mode 100644 index 0000000..de27d2e --- /dev/null +++ b/remote_services/rsa_spi/include/endpoint_description.h @@ -0,0 +1,50 @@ +/** + *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. + */ +/* + * endpoint_description.h + * + * \date 25 Jul 2014 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef ENDPOINT_DESCRIPTION_H_ +#define ENDPOINT_DESCRIPTION_H_ + +#include "properties.h" +#include "array_list.h" + +struct endpoint_description { + char *frameworkUUID; + char *id; + // array_list_pt intents; + char *service; + // HASH_MAP packageVersions; + properties_pt properties; + unsigned long serviceId; +}; + +typedef struct endpoint_description endpoint_description_t; +typedef endpoint_description_t* endpoint_description_pt; + +celix_status_t endpointDescription_create(properties_pt properties, endpoint_description_pt *endpointDescription); +celix_status_t endpointDescription_destroy(endpoint_description_pt description); + + +#endif /* ENDPOINT_DESCRIPTION_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/endpoint_listener.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/include/endpoint_listener.h b/remote_services/rsa_spi/include/endpoint_listener.h new file mode 100644 index 0000000..2e6359f --- /dev/null +++ b/remote_services/rsa_spi/include/endpoint_listener.h @@ -0,0 +1,49 @@ +/** + *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. + */ +/* + * endpoint_listener.h + * + * \date Sep 29, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef ENDPOINT_LISTENER_H_ +#define ENDPOINT_LISTENER_H_ + +#include "array_list.h" +#include "properties.h" + +#include "endpoint_description.h" + +static const char * const OSGI_ENDPOINT_LISTENER_SERVICE = "endpoint_listener"; + +static const char * const OSGI_ENDPOINT_LISTENER_SCOPE = "endpoint.listener.scope"; + +struct endpoint_listener { + void *handle; + celix_status_t (*endpointAdded)(void *handle, endpoint_description_pt endpoint, char *machtedFilter); + celix_status_t (*endpointRemoved)(void *handle, endpoint_description_pt endpoint, char *machtedFilter); +}; + +typedef struct endpoint_listener endpoint_listener_t; +typedef endpoint_listener_t *endpoint_listener_pt; + + +#endif /* ENDPOINT_LISTENER_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/export_registration.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/include/export_registration.h b/remote_services/rsa_spi/include/export_registration.h new file mode 100644 index 0000000..dc3882b --- /dev/null +++ b/remote_services/rsa_spi/include/export_registration.h @@ -0,0 +1,22 @@ +/* + * Licensed under Apache License v2. See LICENSE for more information. + */ +#ifndef CELIX_EXPORT_REGISTRATION_H +#define CELIX_EXPORT_REGISTRATION_H + +#include "celix_errno.h" +#include "endpoint_description.h" +#include "service_reference.h" + +typedef struct export_registration *export_registration_pt; + +typedef struct export_reference *export_reference_pt; + +celix_status_t exportRegistration_close(export_registration_pt registration); +celix_status_t exportRegistration_getException(export_registration_pt registration); +celix_status_t exportRegistration_getExportReference(export_registration_pt registration, export_reference_pt *reference); + +celix_status_t exportReference_getExportedEndpoint(export_reference_pt reference, endpoint_description_pt *endpoint); +celix_status_t exportReference_getExportedService(export_reference_pt reference, service_reference_pt *service); + +#endif //CELIX_EXPORT_REGISTRATION_H http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/import_registration.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/include/import_registration.h b/remote_services/rsa_spi/include/import_registration.h new file mode 100644 index 0000000..ef8193f --- /dev/null +++ b/remote_services/rsa_spi/include/import_registration.h @@ -0,0 +1,22 @@ +/* + * Licensed under Apache License v2. See LICENSE for more information. + */ +#ifndef CELIX_IMPORT_REGISTRATION_H +#define CELIX_IMPORT_REGISTRATION_H + +#include "celix_errno.h" +#include "endpoint_description.h" +#include "service_reference.h" + +typedef struct import_registration *import_registration_pt; + +typedef struct import_reference *import_reference_pt; + +celix_status_t importRegistration_close(import_registration_pt registration); +celix_status_t importRegistration_getException(import_registration_pt registration); +celix_status_t importRegistration_getImportReference(import_registration_pt registration, import_reference_pt *reference); + +celix_status_t importReference_getImportedEndpoint(import_reference_pt reference); +celix_status_t importReference_getImportedService(import_reference_pt reference); + +#endif //CELIX_IMPORT_REGISTRATION_H http://git-wip-us.apache.org/repos/asf/celix/blob/81804e00/remote_services/rsa_spi/include/remote_constants.h ---------------------------------------------------------------------- diff --git a/remote_services/rsa_spi/include/remote_constants.h b/remote_services/rsa_spi/include/remote_constants.h new file mode 100644 index 0000000..0736685 --- /dev/null +++ b/remote_services/rsa_spi/include/remote_constants.h @@ -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. + */ +/* + * remote_constants.h + * + * \date Sep 30, 2011 + * \author Apache Celix Project Team + * \copyright Apache License, Version 2.0 + */ + +#ifndef REMOTE_CONSTANTS_H_ +#define REMOTE_CONSTANTS_H_ + +static const char * const OSGI_RSA_SERVICE_EXPORTED_INTERFACES = "service.exported.interfaces"; +static const char * const OSGI_RSA_ENDPOINT_FRAMEWORK_UUID = "endpoint.framework.uuid"; +static const char * const OSGI_RSA_ENDPOINT_SERVICE_ID = "endpoint.service.id"; +static const char * const OSGI_RSA_ENDPOINT_ID = "endpoint.id"; +static const char * const OSGI_RSA_SERVICE_IMPORTED = "service.imported"; +static const char * const OSGI_RSA_SERVICE_IMPORTED_CONFIGS = "service.imported.configs"; +static const char * const OSGI_RSA_SERVICE_LOCATION = "service.location"; + +#endif /* REMOTE_CONSTANTS_H_ */