You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2015/11/20 18:25:33 UTC
[4/4] celix git commit: CELIX-284: Restrict export and imports based
on properties
CELIX-284: Restrict export and imports based on properties
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/fe94cd14
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/fe94cd14
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/fe94cd14
Branch: refs/heads/develop
Commit: fe94cd14b1a2a073ca0ef1496b22f9ee3da35cdf
Parents: b320876
Author: Bjoern Petri <bp...@apache.org>
Authored: Fri Nov 20 18:24:32 2015 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Fri Nov 20 18:24:32 2015 +0100
----------------------------------------------------------------------
framework/private/src/filter.c | 16 +
framework/public/include/filter.h | 1 +
framework/public/include/service_registration.h | 1 +
remote_services/CMakeLists.txt | 6 +-
.../private/include/remote_service_admin_impl.h | 2 +-
.../private/src/export_registration_impl.c | 7 +-
.../public/include/export_registration.h | 2 +-
.../public/include/remote_service_admin.h | 6 +-
.../remote_service_admin_dfi/CMakeLists.txt | 2 +-
.../remote_service_admin_dfi/rsa/CMakeLists.txt | 1 +
.../private/include/export_registration_dfi.h | 1 +
.../private/include/import_registration_dfi.h | 1 +
.../private/include/remote_service_admin_dfi.h | 5 +-
.../rsa/private/src/export_registration_dfi.c | 5 +-
.../src/remote_service_admin_activator.c | 2 +-
.../rsa/private/src/remote_service_admin_dfi.c | 42 +-
.../src/remote_service_admin_activator.c | 2 +-
.../private/src/remote_service_admin_impl.c | 29 +-
.../private/test/rsa_client_server_tests.cpp | 1 -
.../src/remote_service_admin_activator.c | 2 +-
.../private/src/remote_service_admin_impl.c | 26 +-
.../private/test/rsa_client_server_tests.cpp | 5 +-
remote_services/topology_manager/CMakeLists.txt | 17 +-
.../topology_manager/private/include/scope.h | 150 ++++
.../private/include/topology_manager.h | 3 +-
.../topology_manager/private/src/activator.c | 44 +-
.../topology_manager/private/src/scope.c | 327 ++++++++
.../private/src/topology_manager.c | 815 +++++++++++--------
.../topology_manager/public/include/tm_scope.h | 45 +
.../topology_manager/tms_tst/CMakeLists.txt | 52 ++
.../tms_tst/bundle/CMakeLists.txt | 23 +
.../org.apache.celix.test.MyBundle.descriptor | 9 +
.../tms_tst/bundle/tst_activator.c | 126 +++
.../tms_tst/bundle/tst_service.h | 17 +
.../tms_tst/config.properties.in | 3 +
.../tms_tst/config_import.properties.in | 3 +
.../tms_tst/disc_mock/CMakeLists.txt | 23 +
.../tms_tst/disc_mock/disc_mock_activator.c | 135 +++
.../tms_tst/disc_mock/disc_mock_service.c | 42 +
.../tms_tst/disc_mock/disc_mock_service.h | 41 +
.../topology_manager/tms_tst/run_tests.cpp | 9 +
.../topology_manager/tms_tst/scope.json | 15 +
.../topology_manager/tms_tst/scope2.json | 22 +
.../topology_manager/tms_tst/scope3.json | 28 +
.../topology_manager/tms_tst/scope4.json | 21 +
.../topology_manager/tms_tst/tms_tests.cpp | 715 ++++++++++++++++
46 files changed, 2457 insertions(+), 393 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/framework/private/src/filter.c
----------------------------------------------------------------------
diff --git a/framework/private/src/filter.c b/framework/private/src/filter.c
index de069a4..834280d 100644
--- a/framework/private/src/filter.c
+++ b/framework/private/src/filter.c
@@ -572,3 +572,19 @@ celix_status_t filter_getString(filter_pt filter, char **filterStr) {
}
return CELIX_SUCCESS;
}
+
+celix_status_t filter_match_filter(filter_pt src, filter_pt dest, bool *result) {
+ char *srcStr = NULL;
+ char *destStr = NULL;
+ *result = false;
+
+ if (src) srcStr = src->filterStr;
+ if (dest) destStr = dest->filterStr;
+
+ if ((srcStr != NULL) && (destStr != NULL)) {
+ // TODO: should be done smarted, e.g. src="&(a=1)(b=2)" and dest="&(b=2)(a=1)" should result in true
+ *result = (strcmp(srcStr, destStr) == 0);
+ }
+
+ return CELIX_SUCCESS;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/framework/public/include/filter.h
----------------------------------------------------------------------
diff --git a/framework/public/include/filter.h b/framework/public/include/filter.h
index 94fbf6c..9e78192 100644
--- a/framework/public/include/filter.h
+++ b/framework/public/include/filter.h
@@ -38,6 +38,7 @@ FRAMEWORK_EXPORT filter_pt filter_create(char * filterString);
FRAMEWORK_EXPORT void filter_destroy(filter_pt filter);
FRAMEWORK_EXPORT celix_status_t filter_match(filter_pt filter, properties_pt properties, bool *result);
+FRAMEWORK_EXPORT celix_status_t filter_match_filter(filter_pt src, filter_pt dest, bool *result);
FRAMEWORK_EXPORT celix_status_t filter_getString(filter_pt filter, char **filterStr);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/framework/public/include/service_registration.h
----------------------------------------------------------------------
diff --git a/framework/public/include/service_registration.h b/framework/public/include/service_registration.h
index 22685a9..7f0e17a 100644
--- a/framework/public/include/service_registration.h
+++ b/framework/public/include/service_registration.h
@@ -40,5 +40,6 @@ typedef struct serviceRegistration * service_registration_pt;
FRAMEWORK_EXPORT celix_status_t serviceRegistration_unregister(service_registration_pt registration);
FRAMEWORK_EXPORT celix_status_t serviceRegistration_getProperties(service_registration_pt registration, properties_pt *properties);
FRAMEWORK_EXPORT celix_status_t serviceRegistration_setProperties(service_registration_pt registration, properties_pt properties);
+FRAMEWORK_EXPORT celix_status_t serviceRegistration_getServiceName(service_registration_pt registration, char **serviceName);
#endif /* SERVICE_REGISTRATION_H_ */
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/CMakeLists.txt b/remote_services/CMakeLists.txt
index abc9177..d5d07a3 100644
--- a/remote_services/CMakeLists.txt
+++ b/remote_services/CMakeLists.txt
@@ -32,15 +32,15 @@ if (REMOTE_SERVICE_ADMIN)
add_subdirectory(examples)
add_subdirectory(topology_manager)
-
+
add_subdirectory(discovery_configured)
add_subdirectory(discovery_etcd)
add_subdirectory(discovery_shm)
- add_subdirectory(remote_service_admin)
add_subdirectory(remote_service_admin_http)
- add_subdirectory(remote_service_admin_dfi)
add_subdirectory(remote_service_admin_shm)
+ add_subdirectory(remote_service_admin)
+ add_subdirectory(remote_service_admin_dfi)
endif (REMOTE_SERVICE_ADMIN)
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h b/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
index b28757b..e8a5e1f 100644
--- a/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
+++ b/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
@@ -38,7 +38,7 @@ 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(export_registration_pt registration);
+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);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin/private/src/export_registration_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin/private/src/export_registration_impl.c b/remote_services/remote_service_admin/private/src/export_registration_impl.c
index 18cff6c..20be900 100644
--- a/remote_services/remote_service_admin/private/src/export_registration_impl.c
+++ b/remote_services/remote_service_admin/private/src/export_registration_impl.c
@@ -171,8 +171,6 @@ celix_status_t exportRegistration_endpointRemoved(void * handle, service_referen
remote_endpoint_service_pt endpoint = service;
if (registration->endpoint != NULL) {
- remoteServiceAdmin_removeExportedService(registration);
-// registration->endpoint = NULL;
endpoint->setService(endpoint->endpoint, NULL);
}
@@ -208,9 +206,7 @@ celix_status_t exportRegistration_close(export_registration_pt registration) {
exportRegistration_stopTracking(registration);
bundle_uninstall(registration->bundle);
- remoteServiceAdmin_removeExportedService(registration);
- exportRegistration_destroy(®istration);
return status;
}
@@ -253,8 +249,9 @@ celix_status_t exportReference_getExportedEndpoint(export_reference_pt reference
return status;
}
-celix_status_t exportReference_getExportedService(export_reference_pt reference) {
+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/fe94cd14/remote_services/remote_service_admin/public/include/export_registration.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin/public/include/export_registration.h b/remote_services/remote_service_admin/public/include/export_registration.h
index 9332274..dc3882b 100644
--- a/remote_services/remote_service_admin/public/include/export_registration.h
+++ b/remote_services/remote_service_admin/public/include/export_registration.h
@@ -17,6 +17,6 @@ celix_status_t exportRegistration_getException(export_registration_pt registrati
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);
+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/fe94cd14/remote_services/remote_service_admin/public/include/remote_service_admin.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin/public/include/remote_service_admin.h b/remote_services/remote_service_admin/public/include/remote_service_admin.h
index 274f2e4..1521383 100644
--- a/remote_services/remote_service_admin/public/include/remote_service_admin.h
+++ b/remote_services/remote_service_admin/public/include/remote_service_admin.h
@@ -40,15 +40,15 @@ typedef struct remote_service_admin *remote_service_admin_pt;
struct remote_service_admin_service {
remote_service_admin_pt admin;
celix_status_t (*exportService)(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations);
- celix_status_t (*removeExportedService)(export_registration_pt registration);
+ celix_status_t (*removeExportedService)(remote_service_admin_pt admin, export_registration_pt registration);
celix_status_t (*getExportedServices)(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t (*getImportedEndpoints)(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t (*importService)(remote_service_admin_pt admin, endpoint_description_pt endpoint, import_registration_pt *registration);
celix_status_t (*exportReference_getExportedEndpoint)(export_reference_pt reference, endpoint_description_pt *endpoint);
- celix_status_t (*exportReference_getExportedService)(export_reference_pt reference);
+ celix_status_t (*exportReference_getExportedService)(export_reference_pt reference, service_reference_pt *service);
- celix_status_t (*exportRegistration_close)(export_registration_pt registration);
+ celix_status_t (*exportRegistration_close)(remote_service_admin_pt admin, 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 (*exportRegistration_freeExportReference)(export_reference_pt *reference);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/CMakeLists.txt b/remote_services/remote_service_admin_dfi/CMakeLists.txt
index 275a991..b25909d 100644
--- a/remote_services/remote_service_admin_dfi/CMakeLists.txt
+++ b/remote_services/remote_service_admin_dfi/CMakeLists.txt
@@ -16,7 +16,7 @@
# under the License.
-celix_subproject(RSA_REMOTE_SERVICE_ADMIN_DFI "Option to enable building the Remote Service Admin Service DFI" ON)
+celix_subproject(RSA_REMOTE_SERVICE_ADMIN_DFI "Option to enable building the Remote Service Admin Service DFI" OFF DEPS TOPOLOGY_MANAGER)
if (RSA_REMOTE_SERVICE_ADMIN_DFI)
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/CMakeLists.txt b/remote_services/remote_service_admin_dfi/rsa/CMakeLists.txt
index 2c8ef5d..3fdfd29 100644
--- a/remote_services/remote_service_admin_dfi/rsa/CMakeLists.txt
+++ b/remote_services/remote_service_admin_dfi/rsa/CMakeLists.txt
@@ -21,6 +21,7 @@ include_directories(
${PROJECT_SOURCE_DIR}/log_service/public/include
${PROJECT_SOURCE_DIR}/remote_services/utils/private/include
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/public/include
+ ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/include
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin_http/private/include
${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin_dfi/dynamic_function_interface
${PROJECT_SOURCE_DIR}/remote_services/examples/calculator_service/public/include
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/include/export_registration_dfi.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/include/export_registration_dfi.h b/remote_services/remote_service_admin_dfi/rsa/private/include/export_registration_dfi.h
index 64d5392..93f37ba 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/include/export_registration_dfi.h
+++ b/remote_services/remote_service_admin_dfi/rsa/private/include/export_registration_dfi.h
@@ -26,6 +26,7 @@
#include "endpoint_description.h"
celix_status_t exportRegistration_create(log_helper_pt helper, service_reference_pt reference, endpoint_description_pt endpoint, bundle_context_pt context, export_registration_pt *registration);
+celix_status_t exportRegistration_close(export_registration_pt registration);
void exportRegistration_destroy(export_registration_pt registration);
celix_status_t exportRegistration_start(export_registration_pt registration);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/include/import_registration_dfi.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/include/import_registration_dfi.h b/remote_services/remote_service_admin_dfi/rsa/private/include/import_registration_dfi.h
index 296fc46..8b6140e 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/include/import_registration_dfi.h
+++ b/remote_services/remote_service_admin_dfi/rsa/private/include/import_registration_dfi.h
@@ -28,6 +28,7 @@ typedef void (*send_func_type)(void *handle, endpoint_description_pt endpointDes
celix_status_t importRegistration_create(bundle_context_pt context, endpoint_description_pt description, const char *classObject,
import_registration_pt *import);
+celix_status_t importRegistration_close(import_registration_pt import);
void importRegistration_destroy(import_registration_pt import);
celix_status_t importRegistration_setSendFn(import_registration_pt reg,
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/include/remote_service_admin_dfi.h
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/include/remote_service_admin_dfi.h b/remote_services/remote_service_admin_dfi/rsa/private/include/remote_service_admin_dfi.h
index 64e69e4..b820b79 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/include/remote_service_admin_dfi.h
+++ b/remote_services/remote_service_admin_dfi/rsa/private/include/remote_service_admin_dfi.h
@@ -27,6 +27,7 @@
#ifndef REMOTE_SERVICE_ADMIN_HTTP_IMPL_H_
#define REMOTE_SERVICE_ADMIN_HTTP_IMPL_H_
+
#include "bundle_context.h"
#include "endpoint_description.h"
@@ -38,7 +39,7 @@ celix_status_t remoteServiceAdmin_destroy(remote_service_admin_pt *admin);
celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin);
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_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);
@@ -46,7 +47,7 @@ celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt
celix_status_t exportReference_getExportedEndpoint(export_reference_pt reference, endpoint_description_pt *endpoint);
-celix_status_t exportReference_getExportedService(export_reference_pt reference);
+celix_status_t exportReference_getExportedService(export_reference_pt reference, service_reference_pt *service);
celix_status_t importReference_getImportedEndpoint(import_reference_pt reference);
celix_status_t importReference_getImportedService(import_reference_pt reference);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c b/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
index b528ccd..4b7ec57 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
+++ b/remote_services/remote_service_admin_dfi/rsa/private/src/export_registration_dfi.c
@@ -200,12 +200,14 @@ static void exportRegistration_removeServ(export_registration_pt reg, service_re
celixThreadMutex_unlock(®->mutex);
}
+
celix_status_t exportRegistration_close(export_registration_pt reg) {
celix_status_t status = CELIX_SUCCESS;
exportRegistration_stop(reg);
return status;
}
+
celix_status_t exportRegistration_getException(export_registration_pt registration) {
celix_status_t status = CELIX_SUCCESS;
//TODO
@@ -235,8 +237,9 @@ celix_status_t exportReference_getExportedEndpoint(export_reference_pt reference
return status;
}
-celix_status_t exportReference_getExportedService(export_reference_pt reference) {
+celix_status_t exportReference_getExportedService(export_reference_pt reference, service_reference_pt *ref) {
celix_status_t status = CELIX_SUCCESS;
+ *ref = reference->reference;
return status;
}
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_activator.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_activator.c b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_activator.c
index 242e851..d4cc765 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_activator.c
+++ b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_activator.c
@@ -78,7 +78,7 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context)
remoteServiceAdmin->exportReference_getExportedEndpoint = exportReference_getExportedEndpoint;
remoteServiceAdmin->exportReference_getExportedService = exportReference_getExportedService;
- remoteServiceAdmin->exportRegistration_close = exportRegistration_close;
+ remoteServiceAdmin->exportRegistration_close = remoteServiceAdmin_removeExportedService;
remoteServiceAdmin->exportRegistration_getException = exportRegistration_getException;
remoteServiceAdmin->exportRegistration_getExportReference = exportRegistration_getExportReference;
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
index 384bd76..01cd700 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
+++ b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
@@ -108,7 +108,7 @@ static const char *DEFAULT_IP = "127.0.0.1";
static const unsigned int DEFAULT_TIMEOUT = 0;
static int remoteServiceAdmin_callback(struct mg_connection *conn);
-static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, service_reference_pt reference, char *interface, endpoint_description_pt *description);
+static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, service_reference_pt reference, properties_pt props, char *interface, endpoint_description_pt *description);
static celix_status_t remoteServiceAdmin_send(void *handle, endpoint_description_pt endpointDescription, char *request, char **reply, int* replyStatus);
static celix_status_t remoteServiceAdmin_getIpAdress(char* interface, char** ip);
static size_t remoteServiceAdmin_readCallback(void *ptr, size_t size, size_t nmemb, void *userp);
@@ -213,6 +213,14 @@ celix_status_t remoteServiceAdmin_create(bundle_context_pt context, remote_servi
} while(((*admin)->ctx == NULL) && (port_counter < MAX_NUMBER_OF_RESTARTS));
}
+
+ if (status != CELIX_SUCCESS)
+ printf("111 status is not success\n ");
+ else {
+ printf("111 status is success\n ");
+
+ }
+
return status;
}
@@ -418,8 +426,7 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
endpoint_description_pt endpoint = NULL;
export_registration_pt registration = NULL;
- remoteServiceAdmin_createEndpointDescription(admin, reference, interface, &endpoint);
- printf("RSA: Creating export registration with endpoint pointer %p\n", endpoint);
+ remoteServiceAdmin_createEndpointDescription(admin, reference, properties, interface, &endpoint);
//TOOD precheck if descriptor exists
status = exportRegistration_create(admin->loghelper, reference, endpoint, admin->context, ®istration);
if (status == CELIX_SUCCESS) {
@@ -442,25 +449,36 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
celix_status_t status = CELIX_SUCCESS;
+
logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA_DFI: Removing exported service");
export_reference_pt ref = NULL;
status = exportRegistration_getExportReference(registration, &ref);
if (status == CELIX_SUCCESS) {
+ service_reference_pt servRef;
celixThreadMutex_lock(&admin->exportedServicesLock);
+ exportReference_getExportedService(ref, &servRef);
+
+ hashMap_remove(admin->exportedServices, servRef);
+
exportRegistration_close(registration);
- //exportRegistration_destroy(registration); TODO test
- hashMap_remove(admin->exportedServices, ref);
+ exportRegistration_destroy(registration);
+
celixThreadMutex_unlock(&admin->exportedServicesLock);
+
+ if (ref != NULL) {
+ free(ref);
+ }
} else {
- RSA_LOG_ERROR(admin, "Cannot find reference for registration");
+ logHelper_log(admin->loghelper, OSGI_LOGSERVICE_ERROR, "Cannot find reference for registration");
}
return status;
}
-static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, service_reference_pt reference, char *interface, endpoint_description_pt *endpoint) {
+static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, service_reference_pt reference, properties_pt props, char *interface, endpoint_description_pt *endpoint) {
+
celix_status_t status = CELIX_SUCCESS;
properties_pt endpointProperties = properties_create();
@@ -477,7 +495,6 @@ static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_servic
&& strcmp(key, (char*) OSGI_RSA_SERVICE_EXPORTED_INTERFACES) != 0
&& strcmp(key, (char*) OSGI_FRAMEWORK_OBJECTCLASS) != 0) {
properties_set(endpointProperties, key, value);
- printf("Added property '%s' with value '%s'\n", key, value);
}
}
@@ -507,7 +524,14 @@ static celix_status_t remoteServiceAdmin_createEndpointDescription(remote_servic
properties_set(endpointProperties, (char*) OSGI_RSA_SERVICE_IMPORTED_CONFIGS, (char*) CONFIGURATION_TYPE);
properties_set(endpointProperties, (char*) ENDPOINT_URL, url);
-
+ if (props != NULL) {
+ hash_map_iterator_pt propIter = hashMapIterator_create(props);
+ while (hashMapIterator_hasNext(propIter)) {
+ hash_map_entry_pt entry = hashMapIterator_nextEntry(propIter);
+ properties_set(endpointProperties, (char*)hashMapEntry_getKey(entry), (char*)hashMapEntry_getValue(entry));
+ }
+ hashMapIterator_destroy(propIter);
+ }
*endpoint = calloc(1, sizeof(**endpoint));
if (!*endpoint) {
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c b/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
index 1b4c59c..2851a29 100644
--- a/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
+++ b/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
@@ -76,7 +76,7 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context)
remoteServiceAdmin->exportReference_getExportedEndpoint = exportReference_getExportedEndpoint;
remoteServiceAdmin->exportReference_getExportedService = exportReference_getExportedService;
- remoteServiceAdmin->exportRegistration_close = exportRegistration_close;
+ remoteServiceAdmin->exportRegistration_close = remoteServiceAdmin_removeExportedService;
remoteServiceAdmin->exportRegistration_getException = exportRegistration_getException;
remoteServiceAdmin->exportRegistration_getExportReference = exportRegistration_getExportReference;
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
index c6e9353..8567e23 100644
--- a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
+++ b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
@@ -459,19 +459,32 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
return status;
}
-celix_status_t remoteServiceAdmin_removeExportedService(export_registration_pt registration) {
+celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
celix_status_t status = CELIX_SUCCESS;
- remote_service_admin_pt admin = registration->rsa;
- celixThreadMutex_lock(&admin->exportedServicesLock);
+ logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA_HTTP: Removing exported service");
- array_list_pt registrations = (array_list_pt) hashMap_remove(admin->exportedServices, registration->reference);
+ export_reference_pt ref = NULL;
+ status = exportRegistration_getExportReference(registration, &ref);
- if (registrations != NULL) {
- arrayList_destroy(registrations);
- }
+ if (status == CELIX_SUCCESS) {
+ service_reference_pt servRef;
+ celixThreadMutex_lock(&admin->exportedServicesLock);
+ exportReference_getExportedService(ref, &servRef);
- celixThreadMutex_unlock(&admin->exportedServicesLock);
+ hashMap_remove(admin->exportedServices, servRef);
+
+ exportRegistration_close(registration);
+ exportRegistration_destroy(®istration);
+
+ celixThreadMutex_unlock(&admin->exportedServicesLock);
+
+ if (ref != NULL) {
+ free(ref);
+ }
+ } else {
+ logHelper_log(admin->loghelper, OSGI_LOGSERVICE_ERROR, "Cannot find reference for registration");
+ }
return status;
}
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
index 8e9676d..a2a087a 100644
--- a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
@@ -476,6 +476,5 @@ TEST(RsaHttpClientServerTests, TestProxyRemoval) {
TEST(RsaHttpClientServerTests, TestEndpointRemoval) {
// test is currenlty failing
//testEndpointRemoval();
-
}
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_shm/private/src/remote_service_admin_activator.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_activator.c b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_activator.c
index dd2fb4d..a2b72d0 100644
--- a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_activator.c
+++ b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_activator.c
@@ -76,7 +76,7 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context)
remoteServiceAdmin->exportReference_getExportedEndpoint = exportReference_getExportedEndpoint;
remoteServiceAdmin->exportReference_getExportedService = exportReference_getExportedService;
- remoteServiceAdmin->exportRegistration_close = exportRegistration_close;
+ remoteServiceAdmin->exportRegistration_close = remoteServiceAdmin_removeExportedService;
remoteServiceAdmin->exportRegistration_getException = exportRegistration_getException;
remoteServiceAdmin->exportRegistration_getExportReference = exportRegistration_getExportReference;
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
index 385e9be..813fa19 100644
--- a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
+++ b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
@@ -552,17 +552,24 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
return status;
}
-celix_status_t remoteServiceAdmin_removeExportedService(export_registration_pt registration) {
+celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
celix_status_t status = CELIX_SUCCESS;
- remote_service_admin_pt admin = registration->rsa;
ipc_segment_pt ipc = NULL;
- celixThreadMutex_lock(&admin->exportedServicesLock);
+ export_reference_pt ref = NULL;
+ status = exportRegistration_getExportReference(registration, &ref);
+
+ if (status == CELIX_SUCCESS) {
+ bool *pollThreadRunning = NULL;
+
+ service_reference_pt servRef;
+ celixThreadMutex_lock(&admin->exportedServicesLock);
+ exportReference_getExportedService(ref, &servRef);
- array_list_pt registrations = hashMap_remove(admin->exportedServices, registration->reference);
+ hashMap_remove(admin->exportedServices, servRef);
+
+ exportRegistration_close(registration);
- if ((registrations) != NULL) {
- bool *pollThreadRunning = NULL;
if ((pollThreadRunning = hashMap_get(admin->pollThreadRunning, registration->endpointDescription)) != NULL) {
*pollThreadRunning = false;
@@ -575,7 +582,7 @@ celix_status_t remoteServiceAdmin_removeExportedService(export_registration_pt r
status = celixThread_join(*pollThread, NULL);
if (status == CELIX_SUCCESS) {
- semctl(ipc->semId, 1 /*ignored*/, IPC_RMID);
+ semctl(ipc->semId, 1 , IPC_RMID);
shmctl(ipc->shmId, IPC_RMID, 0);
remoteServiceAdmin_removeSharedIdentityFile(admin, registration->endpointDescription->frameworkUUID, registration->endpointDescription->service);
@@ -591,10 +598,9 @@ celix_status_t remoteServiceAdmin_removeExportedService(export_registration_pt r
}
}
}
-
- arrayList_destroy(registrations);
- registrations = NULL;
+ exportRegistration_destroy(®istration);
}
+
celixThreadMutex_unlock(&admin->exportedServicesLock);
return status;
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
index c5ca43b..b2ebb39 100644
--- a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
@@ -453,6 +453,7 @@ extern "C" {
}
};
+
TEST(RsaShmClientServerTests, Test1) {
test1();
}
@@ -465,7 +466,7 @@ TEST(RsaShmClientServerTests, TestExport) {
// test is currenlty failing
//testExport();
}
-
+/*
TEST(RsaShmClientServerTests, TestProxyRemoval) {
// test is currenlty failing
// testProxyRemoval();
@@ -475,4 +476,4 @@ TEST(RsaShmClientServerTests, TestEndpointRemoval) {
// test is currenlty failing
//testEndpointRemoval();
}
-
+*/
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/topology_manager/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/CMakeLists.txt b/remote_services/topology_manager/CMakeLists.txt
index 27d8501..65194aa 100644
--- a/remote_services/topology_manager/CMakeLists.txt
+++ b/remote_services/topology_manager/CMakeLists.txt
@@ -14,7 +14,7 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-celix_subproject(RSA_TOPOLOGY_MANAGER "Option to enable building the Remote Service Admin Service SHM bundle" ON)
+celix_subproject(RSA_TOPOLOGY_MANAGER "Option to enable building the Remote Service Admin Service SHM bundle" ON DEPS REMOTE_SERVICE_ADMIN_DFI)
if (RSA_TOPOLOGY_MANAGER)
include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
include_directories("${PROJECT_SOURCE_DIR}/remote_services/utils/public/include")
@@ -22,21 +22,32 @@ if (RSA_TOPOLOGY_MANAGER)
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("${PROJECT_SOURCE_DIR}/log_service/public/include")
+ include_directories("${PROJECT_SOURCE_DIR}/remote_services/topology_manager/public/include")
SET_HEADER(BUNDLE_SYMBOLICNAME "apache_celix_rs_topology_manager")
- SET(BUNDLE_VERSION "0.0.1")
+ SET(BUNDLE_VERSION "0.0.2")
SET_HEADERS("Bundle-Name: Apache Celix RS Topology Manager")
bundle(topology_manager SOURCES
private/src/topology_manager
+ private/src/scope
private/src/activator
${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
private/include/topology_manager.h
+ public/include/tm_scope.h
)
install_bundle(topology_manager)
- target_link_libraries(topology_manager celix_framework)
+ if (ENABLE_TESTING)
+ find_package(CppUTest REQUIRED)
+
+ include_directories(${CPPUTEST_INCLUDE_DIR})
+ include_directories(${CPPUTEST_EXT_INCLUDE_DIR})
+ add_subdirectory(tms_tst)
+ endif (ENABLE_TESTING)
+
+ target_link_libraries(topology_manager celix_framework)
endif (RSA_TOPOLOGY_MANAGER)
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/topology_manager/private/include/scope.h
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/include/scope.h b/remote_services/topology_manager/private/include/scope.h
new file mode 100644
index 0000000..4035e2c
--- /dev/null
+++ b/remote_services/topology_manager/private/include/scope.h
@@ -0,0 +1,150 @@
+/**
+ *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.
+ */
+/*
+ * scope.h
+ *
+ * \date Sep 29, 2015
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+
+#ifndef TOPOLOGY_SCOPE_H_
+#define TOPOLOGY_SCOPE_H_
+
+#include "celixbool.h"
+#include "celix_errno.h"
+#include "celix_threads.h"
+#include "hash_map.h"
+#include "endpoint_description.h"
+#include "properties.h"
+#include "service_reference.h"
+#include "tm_scope.h"
+
+typedef struct scope *scope_pt;
+
+
+
+/* \brief create scope structure
+ *
+ * \param owning component pointer
+ * \param scope to be created
+ *
+ * \return CELIX_SUCCESS
+ * CELIX_ENOMEM
+ */
+celix_status_t scope_scopeCreate(void *handle, scope_pt *scope);
+
+/* \brief destroy scope structure
+ *
+ * \param scope to be destroyed
+ *
+ * \return CELIX_SUCCESS
+ */
+celix_status_t scope_scopeDestroy(scope_pt scope);
+
+/* \brief register export scope change callback of topology manager
+ *
+ * \param scope structure
+ * \param changed function pointer
+ *
+ * \return -
+ */
+void scope_setExportScopeChangedCallback(scope_pt scope, celix_status_t (*changed)(void *handle, char *servName));
+
+/* \brief register import scope change callback of topology manager
+ *
+ * \param scope structure
+ * \param changed function pointer
+ *
+ * \return -
+ */
+void scope_setImportScopeChangedCallback(scope_pt scope, celix_status_t (*changed)(void *handle, char *servName));
+
+
+/* \brief Test if scope allows import of service
+ *
+ * \param scope containing import rules
+ * \param endpoint import service endpoint description
+ *
+ * \return true import allowed
+ * false import not allowed
+ */
+bool scope_allowImport(scope_pt scope, endpoint_description_pt endpoint);
+
+/* \brief Test if scope allows import of service
+ *
+ * \param scope containing export rules
+ * \param reference to service
+ * \param props, additional properties defining restrictions for the exported service
+ * NULL if no additional restrictions found
+ *
+ * \return CELIX_SUCCESS
+ *
+ */
+celix_status_t scope_getExportProperties(scope_pt scope, service_reference_pt reference, properties_pt *props);
+
+/* \brief add restricted scope for specified exported service
+ *
+ * \param handle pointer to scope
+ * \param filter, filter string
+ * \param props additional properties defining restrictions for the exported service
+ *
+ * \return CELIX_SUCCESS if added to scope
+ * CELIX_ILLEGAL_ARGUMENT if service scope is already restricted before
+ *
+ */
+celix_status_t tm_addExportScope(void *handle, char *filter, properties_pt props);
+
+/* \brief remove restricted scope for specified exported service
+ *
+ * \param handle pointer to scope
+ * \param filter, filter string
+ *
+ * \return CELIX_SUCCESS if removed
+ * CELIX_ILLEGAL_ARGUMENT if service not found in scope
+ *
+ */
+celix_status_t tm_removeExportScope(void *handle, char *filter);
+
+/* \brief add restricted scope for specified imported service
+ *
+ * \param handle pointer to scope
+ * \param filter, filter string
+ * \param props additional properties defining restrictions for the imported service
+ *
+ * \return CELIX_SUCCESS if added to scope
+ * CELIX_ILLEGAL_ARGUMENT if service scope is already restricted before
+ *
+ */
+celix_status_t tm_addImportScope(void *handle, char *filter);
+
+
+/* \brief remove restricted scope for specified imported service
+ *
+ * \param handle pointer to scope
+ * \param filter, filter string
+ *
+ * \return CELIX_SUCCESS if removed
+ * CELIX_ILLEGAL_ARGUMENT if service not found in scope
+ *
+ */
+celix_status_t tm_removeImportScope(void *handle, char *filter);
+
+
+#endif // TOPOLOGY_SCOPE_H_
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/topology_manager/private/include/topology_manager.h
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/include/topology_manager.h b/remote_services/topology_manager/private/include/topology_manager.h
index ade5a1e..7e5e917 100644
--- a/remote_services/topology_manager/private/include/topology_manager.h
+++ b/remote_services/topology_manager/private/include/topology_manager.h
@@ -31,12 +31,13 @@
#include "service_reference.h"
#include "bundle_context.h"
#include "log_helper.h"
+#include "scope.h"
#define OSGI_RSA_REMOTE_SERVICE_ADMIN "remote_service_admin"
typedef struct topology_manager *topology_manager_pt;
-celix_status_t topologyManager_create(bundle_context_pt context, log_helper_pt logHelper, topology_manager_pt *manager);
+celix_status_t topologyManager_create(bundle_context_pt context, log_helper_pt logHelper, topology_manager_pt *manager, void **scope);
celix_status_t topologyManager_destroy(topology_manager_pt manager);
celix_status_t topologyManager_closeImports(topology_manager_pt manager);
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/topology_manager/private/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/src/activator.c b/remote_services/topology_manager/private/src/activator.c
index 42046b3..a6ee750 100644
--- a/remote_services/topology_manager/private/src/activator.c
+++ b/remote_services/topology_manager/private/src/activator.c
@@ -39,6 +39,9 @@
#include "listener_hook_service.h"
#include "log_service.h"
#include "log_helper.h"
+#include "scope.h"
+#include "tm_scope.h"
+#include "topology_manager.h"
struct activator {
bundle_context_pt context;
@@ -55,6 +58,9 @@ struct activator {
listener_hook_service_pt hookService;
service_registration_pt hook;
+ tm_scope_service_pt scopeService;
+ service_registration_pt scopeReg;
+
log_helper_pt loghelper;
};
@@ -66,8 +72,9 @@ static celix_status_t bundleActivator_createServiceListener(struct activator *ac
celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
celix_status_t status = CELIX_SUCCESS;
struct activator *activator = NULL;
+ void *scope;
- activator = malloc(sizeof(struct activator));
+ activator = calloc(1, sizeof(struct activator));
if (!activator) {
return CELIX_ENOMEM;
@@ -80,11 +87,25 @@ celix_status_t bundleActivator_create(bundle_context_pt context, void **userData
activator->manager = NULL;
activator->remoteServiceAdminTracker = NULL;
activator->serviceListener = NULL;
+ activator->scopeService = calloc(1, sizeof(*(activator->scopeService)));
+ if (activator->scopeService == NULL)
+ {
+ free(activator);
+ return CELIX_ENOMEM;
+ }
+
+ activator->scopeService->addExportScope = tm_addExportScope;
+ activator->scopeService->removeExportScope = tm_removeExportScope;
+ activator->scopeService->addImportScope = tm_addImportScope;
+ activator->scopeService->removeImportScope = tm_removeImportScope;
+ activator->scopeReg = NULL; // explicitly needed, otherwise exception
logHelper_create(context, &activator->loghelper);
logHelper_start(activator->loghelper);
- status = topologyManager_create(context, activator->loghelper, &activator->manager);
+ status = topologyManager_create(context, activator->loghelper, &activator->manager, &scope);
+ activator->scopeService->handle = scope;
+
if (status == CELIX_SUCCESS) {
status = bundleActivator_createEPLTracker(activator, &activator->endpointListenerTracker);
if (status == CELIX_SUCCESS) {
@@ -92,7 +113,7 @@ celix_status_t bundleActivator_create(bundle_context_pt context, void **userData
if (status == CELIX_SUCCESS) {
status = bundleActivator_createServiceListener(activator, &activator->serviceListener);
if (status == CELIX_SUCCESS) {
- *userData = activator;
+ *userData = activator;
}
}
}
@@ -117,7 +138,7 @@ static celix_status_t bundleActivator_createEPLTracker(struct activator *activat
}
static celix_status_t bundleActivator_createRSATracker(struct activator *activator, service_tracker_pt *tracker) {
- celix_status_t status = CELIX_SUCCESS;
+ celix_status_t status;
service_tracker_customizer_pt customizer = NULL;
@@ -145,7 +166,7 @@ static celix_status_t bundleActivator_createServiceListener(struct activator *ac
}
celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
+ celix_status_t status;
struct activator *activator = userData;
endpoint_listener_pt endpointListener = malloc(sizeof(*endpointListener));
@@ -196,6 +217,8 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context)
status = serviceTracker_open(activator->endpointListenerTracker);
}
+ bundleContext_registerService(context, (char *) TOPOLOGYMANAGER_SCOPE_SERVICE, activator->scopeService, NULL, &activator->scopeReg);
+
array_list_pt references = NULL;
bundleContext_getServiceReferences(context, NULL, "(service.exported.interfaces=*)", &references);
int i;
@@ -203,9 +226,9 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context)
service_reference_pt reference = arrayList_get(references, i);
char *serviceId = NULL;
status = CELIX_DO_IF(status, serviceReference_getProperty(reference, (char *)OSGI_FRAMEWORK_SERVICE_ID, &serviceId));
- status = CELIX_DO_IF(status, topologyManager_addExportedService(activator->manager, reference, serviceId));
- }
+ CELIX_DO_IF(status, topologyManager_addExportedService(activator->manager, reference, serviceId));
+ }
arrayList_destroy(references);
return status;
@@ -232,6 +255,8 @@ celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context)
serviceRegistration_unregister(activator->endpointListenerService);
free(activator->endpointListener);
+ serviceRegistration_unregister(activator->scopeReg);
+
topologyManager_closeImports(activator->manager);
return status;
@@ -248,6 +273,11 @@ celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt contex
logHelper_destroy(&activator->loghelper);
status = topologyManager_destroy(activator->manager);
+
+ if (activator->scopeService) {
+ free(activator->scopeService);
+ }
+
free(activator);
}
http://git-wip-us.apache.org/repos/asf/celix/blob/fe94cd14/remote_services/topology_manager/private/src/scope.c
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/src/scope.c b/remote_services/topology_manager/private/src/scope.c
new file mode 100644
index 0000000..38eadfc
--- /dev/null
+++ b/remote_services/topology_manager/private/src/scope.c
@@ -0,0 +1,327 @@
+/**
+ *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.
+ */
+/*
+ * scope.c
+ *
+ * \date Sep 29, 2015
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <jansson.h>
+#include "scope.h"
+#include "tm_scope.h"
+#include "topology_manager.h"
+#include "utils.h"
+
+struct scope_item {
+ properties_pt props;
+};
+
+struct scope {
+ void *manager; // owner of the scope datastructure
+ celix_thread_mutex_t exportScopeLock;
+ hash_map_pt exportScopes; // key is filter, value is scope_item (properties set)
+
+ celix_thread_mutex_t importScopeLock;
+ array_list_pt importScopes; // list of filters
+
+ celix_status_t (*exportScopeChangedHandler)(void* manager, char *filter);
+ celix_status_t (*importScopeChangedHandler)(void* manager, char *filter);
+};
+
+static celix_status_t import_equal(void *, void *, bool *equals);
+
+/*
+ * SERVICES
+ */
+
+celix_status_t tm_addExportScope(void *handle, char *filter, properties_pt props) {
+ celix_status_t status = CELIX_SUCCESS;
+ scope_pt scope = (scope_pt) handle;
+ properties_pt present;
+
+ if (handle == NULL)
+ return CELIX_ILLEGAL_ARGUMENT;
+
+ if (celixThreadMutex_lock(&scope->exportScopeLock) == CELIX_SUCCESS) {
+ // For now we just don't allow two exactly the same filters
+ // TODO: What we actually need is the following
+ // If part of the new filter is already present in any of the filters in exportScopes
+ // we have to assure that the new filter defines other property keys than the property keys
+ // in the already defined filter!
+ present = (properties_pt) hashMap_get(scope->exportScopes, filter);
+ if (present == NULL) {
+ struct scope_item *item = calloc(1, sizeof(*item));
+ if (item == NULL) {
+ status = CELIX_ENOMEM;
+ } else {
+ item->props = props;
+ hashMap_put(scope->exportScopes, (void*) strdup(filter), (void*) item);
+ }
+ } else {
+ // don't allow the same filter twice
+ properties_destroy(props);
+ status = CELIX_ILLEGAL_ARGUMENT;
+ }
+ celixThreadMutex_unlock(&scope->exportScopeLock);
+ }
+
+ if (scope->exportScopeChangedHandler != NULL) {
+ status = CELIX_DO_IF(status, scope->exportScopeChangedHandler(scope->manager, filter));
+ }
+
+ return status;
+}
+
+celix_status_t tm_removeExportScope(void *handle, char *filter) {
+ celix_status_t status = CELIX_SUCCESS;
+ scope_pt scope = (scope_pt) handle;
+
+ if (handle == NULL)
+ return CELIX_ILLEGAL_ARGUMENT;
+
+ if (celixThreadMutex_lock(&scope->exportScopeLock) == CELIX_SUCCESS) {
+ struct scope_item *present = (struct scope_item *) hashMap_get(scope->exportScopes, filter);
+ if (present == NULL) {
+ status = CELIX_ILLEGAL_ARGUMENT;
+ } else {
+ properties_destroy(present->props);
+ hashMap_remove(scope->exportScopes, filter); // frees also the item!
+ }
+ celixThreadMutex_unlock(&scope->exportScopeLock);
+ }
+ if (scope->exportScopeChangedHandler != NULL) {
+ status = CELIX_DO_IF(status, scope->exportScopeChangedHandler(scope->manager, filter));
+ }
+ return status;
+}
+
+celix_status_t tm_addImportScope(void *handle, char *filter) {
+ celix_status_t status = CELIX_SUCCESS;
+ scope_pt scope = (scope_pt) handle;
+
+ filter_pt new;
+
+ if (handle == NULL)
+ return CELIX_ILLEGAL_ARGUMENT;
+ new = filter_create(filter);
+ if (new == NULL) {
+ return CELIX_ILLEGAL_ARGUMENT; // filter not parseble
+ }
+ if (celixThreadMutex_lock(&scope->importScopeLock) == CELIX_SUCCESS) {
+ int index = arrayList_indexOf(scope->importScopes, new);
+ filter_pt present = (filter_pt) arrayList_get(scope->importScopes, index);
+ if (present == NULL) {
+ arrayList_add(scope->importScopes, new);
+ } else {
+ filter_destroy(new);
+ status = CELIX_ILLEGAL_ARGUMENT;
+ }
+
+ celixThreadMutex_unlock(&scope->importScopeLock);
+ }
+ if (scope->importScopeChangedHandler != NULL) {
+ status = CELIX_DO_IF(status, scope->importScopeChangedHandler(scope->manager, filter));
+ }
+ return status;
+}
+
+celix_status_t tm_removeImportScope(void *handle, char *filter) {
+ celix_status_t status = CELIX_SUCCESS;
+ scope_pt scope = (scope_pt) handle;
+ filter_pt new;
+
+ if (handle == NULL)
+ return CELIX_ILLEGAL_ARGUMENT;
+
+ new = filter_create(filter);
+ if (new == NULL) {
+ return CELIX_ILLEGAL_ARGUMENT; // filter not parseble
+ }
+
+ if (celixThreadMutex_lock(&scope->importScopeLock) == CELIX_SUCCESS) {
+ int index = arrayList_indexOf(scope->importScopes, new);
+ filter_pt present = (filter_pt) arrayList_get(scope->importScopes, index);
+ if (present == NULL)
+ status = CELIX_ILLEGAL_ARGUMENT;
+ else {
+ arrayList_removeElement(scope->importScopes, present);
+ filter_destroy(present);
+ }
+ celixThreadMutex_unlock(&scope->importScopeLock);
+ }
+ if (scope->importScopeChangedHandler != NULL) {
+ status = CELIX_DO_IF(status, scope->importScopeChangedHandler(scope->manager, filter));
+ }
+ filter_destroy(new);
+ return status;
+}
+
+/*****************************************************************************
+ * GLOBAL FUNCTIONS
+ *****************************************************************************/
+
+void scope_setExportScopeChangedCallback(scope_pt scope, celix_status_t (*changed)(void *handle, char *servName)) {
+ scope->exportScopeChangedHandler = changed;
+}
+
+void scope_setImportScopeChangedCallback(scope_pt scope, celix_status_t (*changed)(void *handle, char *servName)) {
+ scope->importScopeChangedHandler = changed;
+}
+
+celix_status_t scope_scopeCreate(void *handle, scope_pt *scope) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ *scope = calloc(1, sizeof **scope);
+
+ if (*scope == NULL) {
+ return CELIX_ENOMEM;
+ }
+
+ (*scope)->manager = handle;
+ celixThreadMutex_create(&(*scope)->exportScopeLock, NULL);
+ celixThreadMutex_create(&(*scope)->importScopeLock, NULL);
+
+ (*scope)->exportScopes = hashMap_create(utils_stringHash, NULL, utils_stringEquals, NULL);
+ arrayList_createWithEquals(import_equal, &((*scope)->importScopes));
+ (*scope)->exportScopeChangedHandler = NULL;
+
+ return status;
+}
+
+celix_status_t scope_scopeDestroy(scope_pt scope) {
+ celix_status_t status = CELIX_SUCCESS;
+
+ if (celixThreadMutex_lock(&scope->exportScopeLock) == CELIX_SUCCESS) {
+ hash_map_iterator_pt iter = hashMapIterator_create(scope->exportScopes);
+ while (hashMapIterator_hasNext(iter)) {
+ hash_map_entry_pt scopedEntry = hashMapIterator_nextEntry(iter);
+ struct scope_item *item = (struct scope_item*) hashMapEntry_getValue(scopedEntry);
+ properties_destroy(item->props);
+ }
+ hashMapIterator_destroy(iter);
+ hashMap_destroy(scope->exportScopes, true, true); // free keys, free values
+ celixThreadMutex_unlock(&scope->exportScopeLock);
+ }
+
+ if (celixThreadMutex_lock(&scope->importScopeLock) == CELIX_SUCCESS) {
+ array_list_iterator_pt imp_iter = arrayListIterator_create(scope->importScopes);
+ while (arrayListIterator_hasNext(imp_iter)) {
+ filter_pt element = (filter_pt) arrayListIterator_next(imp_iter);
+ filter_destroy(element);
+ // no need to call arrayList_removeElement(element) because complete list is destroyed
+ }
+ arrayListIterator_destroy(imp_iter);
+ arrayList_destroy(scope->importScopes);
+ celixThreadMutex_unlock(&scope->importScopeLock);
+ }
+
+ celixThreadMutex_destroy(&scope->exportScopeLock);
+ celixThreadMutex_destroy(&scope->importScopeLock);
+ free(scope);
+ return status;
+}
+
+/*****************************************************************************
+ * STATIC FUNCTIONS
+ *****************************************************************************/
+static celix_status_t import_equal(void *src, void *dest, bool *equals) {
+ celix_status_t status;
+
+ filter_pt src_filter = (filter_pt) src;
+ filter_pt dest_filter = (filter_pt) dest;
+ status = filter_match_filter(src_filter, dest_filter, equals);
+ return status;
+}
+
+bool scope_allowImport(scope_pt scope, endpoint_description_pt endpoint) {
+ bool allowImport = false;
+ array_list_iterator_pt iter;
+
+ if (celixThreadMutex_lock(&(scope->importScopeLock)) == CELIX_SUCCESS) {
+ if (arrayList_size(scope->importScopes) == 0) {
+ allowImport = true;
+ } else {
+ iter = arrayListIterator_create(scope->importScopes);
+ while ((allowImport == false) && arrayListIterator_hasNext(iter)) {
+ filter_pt element = (filter_pt) arrayListIterator_next(iter);
+ filter_match(element, endpoint->properties, &allowImport);
+ }
+ arrayListIterator_destroy(iter);
+ }
+ celixThreadMutex_unlock(&scope->importScopeLock);
+ }
+ return allowImport;
+}
+
+celix_status_t scope_getExportProperties(scope_pt scope, service_reference_pt reference, properties_pt *props) {
+ celix_status_t status = CELIX_SUCCESS;
+ unsigned int size = 0;
+ char **keys;
+ bool found = false;
+
+ *props = NULL;
+ properties_pt serviceProperties = properties_create(); // GB: not sure if a copy is needed
+ // or serviceReference_getProperties() is
+ // is acceptable
+
+ serviceReference_getPropertyKeys(reference, &keys, &size);
+ for (int i = 0; i < size; i++) {
+ char *key = keys[i];
+ char *value = NULL;
+
+ if (serviceReference_getProperty(reference, key, &value) == CELIX_SUCCESS) {
+// && strcmp(key, (char*) OSGI_RSA_SERVICE_EXPORTED_INTERFACES) != 0
+// && strcmp(key, (char*) OSGI_FRAMEWORK_OBJECTCLASS) != 0) {
+ properties_set(serviceProperties, key, value);
+ }
+
+ }
+
+ free(keys);
+
+ if (celixThreadMutex_lock(&(scope->exportScopeLock)) == CELIX_SUCCESS) {
+ hash_map_iterator_pt scopedPropIter = hashMapIterator_create(scope->exportScopes);
+ // TODO: now stopping if first filter matches, alternatively we could build up
+ // the additional output properties for each filter that matches?
+ while ((!found) && hashMapIterator_hasNext(scopedPropIter)) {
+ hash_map_entry_pt scopedEntry = hashMapIterator_nextEntry(scopedPropIter);
+ char *filterStr = (char *) hashMapEntry_getKey(scopedEntry);
+ filter_pt filter = filter_create(filterStr);
+ if (filter != NULL) {
+ // test if the scope filter matches the exported service properties
+ status = filter_match(filter, serviceProperties, &found);
+ if (found) {
+ struct scope_item *item = (struct scope_item *) hashMapEntry_getValue(scopedEntry);
+ *props = item->props;
+ }
+ }
+ filter_destroy(filter);
+ }
+ hashMapIterator_destroy(scopedPropIter);
+ properties_destroy(serviceProperties);
+
+ celixThreadMutex_unlock(&(scope->exportScopeLock));
+ }
+
+ return status;
+}