You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2018/01/30 19:19:30 UTC
[34/50] [abbrv] celix git commit: CELIX-418: Added functionality to
run executables without config.properties
CELIX-418: Added functionality to run executables without config.properties
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/5c9e52e2
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/5c9e52e2
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/5c9e52e2
Branch: refs/heads/master
Commit: 5c9e52e238fb7dc5b33bd4a979315c701113c0bc
Parents: 7bf5886
Author: Roy Lenferink <le...@gmail.com>
Authored: Wed Dec 27 18:56:10 2017 +0100
Committer: Roy Lenferink <le...@gmail.com>
Committed: Wed Dec 27 19:57:36 2017 +0100
----------------------------------------------------------------------
cmake/cmake_celix/DeployPackaging.cmake | 28 +++++++++-
framework/private/src/celix_launcher.c | 71 +++++++++++++++++++++++++-
framework/public/include/celix_launcher.h | 2 +
utils/private/src/properties.c | 28 ++++++++++
utils/public/include/properties.h | 2 +
5 files changed, 128 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/5c9e52e2/cmake/cmake_celix/DeployPackaging.cmake
----------------------------------------------------------------------
diff --git a/cmake/cmake_celix/DeployPackaging.cmake b/cmake/cmake_celix/DeployPackaging.cmake
index 91200d8..0ec2322 100644
--- a/cmake/cmake_celix/DeployPackaging.cmake
+++ b/cmake/cmake_celix/DeployPackaging.cmake
@@ -92,7 +92,33 @@ function(add_celix_container)
else ()
add_custom_command(OUTPUT ${LAUNCHER_SRC}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/celix/gen
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LAUNCHER_ORG} ${LAUNCHER_SRC}
+ )
+
+ if (CONTAINER_CXX)
+ set(STAGE1_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/${CONTAINER_TARGET}-main-stage1.cc")
+ else()
+ set(STAGE1_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/${CONTAINER_TARGET}-main-stage1.c")
+ endif()
+
+ file(GENERATE
+ OUTPUT "${STAGE1_LAUNCHER}"
+ CONTENT "#include <celix_launcher.h>
+
+int main(int argc, char *argv[]) {
+ const char * config = \"cosgi.auto.start.1=$<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_BUNDLES>, >\\n\\
+$<JOIN:$<TARGET_PROPERTY:${CONTAINER_TARGET},CONTAINER_PROPERTIES>,\\n\\
+>\";
+
+ properties_pt packedConfig = properties_loadFromString(config);
+
+ return celixLauncher_launchWithArgsAndProps(argc, argv, packedConfig);
+}
+"
+ )
+
+ file(GENERATE
+ OUTPUT "${LAUNCHER_SRC}"
+ INPUT "${STAGE1_LAUNCHER}"
)
include_directories(${CELIX_INCLUDE_DIRS})
http://git-wip-us.apache.org/repos/asf/celix/blob/5c9e52e2/framework/private/src/celix_launcher.c
----------------------------------------------------------------------
diff --git a/framework/private/src/celix_launcher.c b/framework/private/src/celix_launcher.c
index ba83f25..4732b15 100644
--- a/framework/private/src/celix_launcher.c
+++ b/framework/private/src/celix_launcher.c
@@ -48,11 +48,21 @@ static void show_usage(char* prog_name);
static void shutdown_framework(int signal);
static void ignore(int signal);
+static int celixLauncher_launchWithConfigAndProps(const char *configFile, framework_pt *framework, properties_pt packedConfig);
+static int celixLauncher_launchWithStreamAndProps(FILE *stream, framework_pt *framework, properties_pt packedConfig);
+
#define DEFAULT_CONFIG_FILE "config.properties"
static framework_pt framework = NULL;
+/**
+ * Method kept because of usage in examples & unit tests
+ */
int celixLauncher_launchWithArgs(int argc, char *argv[]) {
+ return celixLauncher_launchWithArgsAndProps(argc, argv, NULL);
+}
+
+int celixLauncher_launchWithArgsAndProps(int argc, char *argv[], properties_pt packedConfig) {
// Perform some minimal command-line option parsing...
char *opt = NULL;
if (argc > 1) {
@@ -84,7 +94,7 @@ int celixLauncher_launchWithArgs(int argc, char *argv[]) {
sigaction(SIGUSR1, &sigact, NULL);
sigaction(SIGUSR2, &sigact, NULL);
- int rc = celixLauncher_launch(config_file, &framework);
+ int rc = celixLauncher_launchWithConfigAndProps(config_file, &framework, packedConfig);
if (rc == 0) {
celixLauncher_waitForShutdown(framework);
celixLauncher_destroy(framework);
@@ -107,15 +117,25 @@ static void ignore(int signal) {
}
int celixLauncher_launch(const char *configFile, framework_pt *framework) {
+ return celixLauncher_launchWithConfigAndProps(configFile, framework, NULL);
+}
+
+static int celixLauncher_launchWithConfigAndProps(const char *configFile, framework_pt *framework, properties_pt packedConfig){
int status = 0;
FILE *config = fopen(configFile, "r");
- if (config != NULL) {
+
+ if (config != NULL && packedConfig != NULL) {
+ status = celixLauncher_launchWithStreamAndProps(config, framework, packedConfig);
+ } else if (config != NULL) {
status = celixLauncher_launchWithStream(config, framework);
+ } else if (packedConfig != NULL) {
+ status = celixLauncher_launchWithProperties(packedConfig, framework);
} else {
fprintf(stderr, "Error: invalid or non-existing configuration file: '%s'.", configFile);
perror("");
status = 1;
}
+
return status;
}
@@ -137,6 +157,53 @@ int celixLauncher_launchWithStream(FILE *stream, framework_pt *framework) {
return status;
}
+static int celixLauncher_launchWithStreamAndProps(FILE *stream, framework_pt *framework, properties_pt packedConfig){
+ int status = 0;
+
+ properties_pt runtimeConfig = properties_loadWithStream(stream);
+ fclose(stream);
+
+ // Make sure we've read it and that nothing went wrong with the file access...
+ // If there is no runtimeConfig, the packedConfig can be stored as global config
+ if (runtimeConfig == NULL){
+ runtimeConfig = packedConfig;
+ }
+
+ if (runtimeConfig == NULL) {
+ fprintf(stderr, "Error: invalid configuration file");
+ perror(NULL);
+ status = 1;
+ } else {
+ // Check if there's a pre-compiled config available
+ if (packedConfig != NULL){
+ // runtimeConfig and packedConfig must be merged
+ // when a duplicate of a key is available, the runtimeConfig must be prioritized
+
+ hash_map_iterator_t iter = hashMapIterator_construct(packedConfig);
+
+ hash_map_entry_pt entry = hashMapIterator_nextEntry(&iter);
+ const char * key = (const char *) hashMapEntry_getKey(entry);
+ const char * value = (const char *) hashMapEntry_getValue(entry);
+
+ while (entry != NULL) {
+ // Check existence of key in runtimeConfig
+ if (!hashMap_containsKey(runtimeConfig, key)) {
+ properties_set(runtimeConfig, key, value);
+ }
+
+ entry = hashMapIterator_nextEntry(&iter);
+ if (entry != NULL) {
+ key = (const char *) hashMapEntry_getKey(entry);
+ value = (const char *) hashMapEntry_getValue(entry);
+ }
+ }
+ }
+
+ status = celixLauncher_launchWithProperties(runtimeConfig, framework);
+ }
+
+ return status;
+}
int celixLauncher_launchWithProperties(properties_pt config, framework_pt *framework) {
celix_status_t status;
http://git-wip-us.apache.org/repos/asf/celix/blob/5c9e52e2/framework/public/include/celix_launcher.h
----------------------------------------------------------------------
diff --git a/framework/public/include/celix_launcher.h b/framework/public/include/celix_launcher.h
index 0d819c9..5c7cf4d 100644
--- a/framework/public/include/celix_launcher.h
+++ b/framework/public/include/celix_launcher.h
@@ -36,6 +36,8 @@ extern "C" {
int celixLauncher_launchWithArgs(int argc, char *argv[]);
+int celixLauncher_launchWithArgsAndProps(int argc, char *argv[], properties_pt config);
+
int celixLauncher_launch(const char *configFile, framework_pt *framework);
int celixLauncher_launchWithStream(FILE *config, framework_pt *framework);
http://git-wip-us.apache.org/repos/asf/celix/blob/5c9e52e2/utils/private/src/properties.c
----------------------------------------------------------------------
diff --git a/utils/private/src/properties.c b/utils/private/src/properties.c
index 0bd6dc3..1e097a0 100644
--- a/utils/private/src/properties.c
+++ b/utils/private/src/properties.c
@@ -96,6 +96,34 @@ properties_pt properties_loadWithStream(FILE *file) {
return props;
}
+properties_pt properties_loadFromString(const char *input){
+ properties_pt props = properties_create();
+
+ char *in = strdup(input);
+ char *line = NULL;
+ char *saveLinePointer = NULL;
+
+ bool firstTime = true;
+ do {
+ if (firstTime){
+ line = strtok_r(in, "\n", &saveLinePointer);
+ firstTime = false;
+ }else {
+ line = strtok_r(NULL, "\n", &saveLinePointer);
+ }
+
+ if (line == NULL){
+ break;
+ }
+
+ parseLine(line, props);
+ } while(line != NULL);
+
+ free(in);
+
+ return props;
+}
+
/**
* Header is ignored for now, cannot handle comments yet
http://git-wip-us.apache.org/repos/asf/celix/blob/5c9e52e2/utils/public/include/properties.h
----------------------------------------------------------------------
diff --git a/utils/public/include/properties.h b/utils/public/include/properties.h
index cf93ca0..5c6dc4d 100644
--- a/utils/public/include/properties.h
+++ b/utils/public/include/properties.h
@@ -46,6 +46,8 @@ UTILS_EXPORT properties_pt properties_load(const char *filename);
UTILS_EXPORT properties_pt properties_loadWithStream(FILE *stream);
+UTILS_EXPORT properties_pt properties_loadFromString(const char *input);
+
UTILS_EXPORT void properties_store(properties_pt properties, const char *file, const char *header);
UTILS_EXPORT const char *properties_get(properties_pt properties, const char *key);