This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/develop by this push:
     new cbab88d  Fix for http admin service tree not registering the URIs 
properly (#124)
cbab88d is described below

commit cbab88d8d57b80d55d71470ae129d94935a0a2fc
Author: dhbfischer <[email protected]>
AuthorDate: Tue Oct 22 16:58:54 2019 +0200

    Fix for http admin service tree not registering the URIs properly (#124)
---
 bundles/http_admin/http_admin/src/service_tree.c | 42 +++++++++++++++++-------
 bundles/http_admin/http_admin/src/service_tree.h |  1 -
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/bundles/http_admin/http_admin/src/service_tree.c 
b/bundles/http_admin/http_admin/src/service_tree.c
index b4711fc..46aa4e1 100644
--- a/bundles/http_admin/http_admin/src/service_tree.c
+++ b/bundles/http_admin/http_admin/src/service_tree.c
@@ -31,8 +31,13 @@
 
 #include "service_tree.h"
 
+//Local function prototypes
+static service_tree_node_t *createServiceNode(service_tree_node_t *parent, 
service_tree_node_t *children, service_tree_node_t *next, service_tree_node_t 
*prev, const char *uri, void *svc);
+static size_t getUriTokenCount(const char *uri, const char *separator);
 
-service_tree_node_t *createServiceNode(service_tree_node_t *parent, 
service_tree_node_t *children, service_tree_node_t *next, service_tree_node_t 
*prev, const char *uri, void *svc) {
+
+
+static service_tree_node_t *createServiceNode(service_tree_node_t *parent, 
service_tree_node_t *children, service_tree_node_t *next, service_tree_node_t 
*prev, const char *uri, void *svc) {
     service_tree_node_t *node = calloc(1, sizeof(service_tree_node_t));
     node->parent = parent;
     node->children = children;
@@ -44,11 +49,28 @@ service_tree_node_t *createServiceNode(service_tree_node_t 
*parent, service_tree
     return node;
 }
 
+static size_t getUriTokenCount(const char *uri, const char *separator) {
+    char *saveptr, *token;
+    char *uri_cpy = strdup(uri);
+    size_t tokenCount = 0;
+
+    token = strtok_r(uri_cpy, separator, &saveptr);
+    while(token != NULL) {
+        tokenCount++;
+        token = strtok_r(NULL, separator, &saveptr);
+    }
+
+    free(uri_cpy);
+    return tokenCount;
+}
+
 bool addServiceNode(service_tree_t *svc_tree, const char *uri, void *svc) {
-    char *save_ptr = NULL; //Used internally by strtok_r to point to the next 
token (NULL if no token left)
+    char *save_ptr = NULL; //Used internally by strtok_r
     char *uri_cpy = NULL;
     char *req_uri = NULL;
     bool uri_exists = true;
+    size_t tokenCount = getUriTokenCount(uri, "/");
+    size_t subNodeCount = 1;
 
     if(svc_tree == NULL || uri == NULL){
         return false;
@@ -77,7 +99,7 @@ bool addServiceNode(service_tree_t *svc_tree, const char 
*uri, void *svc) {
     } else if(svc_tree->root_node == NULL) { //No service yet added
         uri_cpy = strdup(uri);
         req_uri = strtok_r(uri_cpy, "/", &save_ptr);
-        svc_tree->root_node = createServiceNode(NULL, NULL, NULL, NULL, 
req_uri, (strcmp(req_uri, "") == 0 ? svc : NULL));
+        svc_tree->root_node = createServiceNode(NULL, NULL, NULL, NULL, 
req_uri, (tokenCount == 1 ? svc : NULL));
         svc_tree->tree_node_count = 1;
         uri_exists = false;
     } else if(strcmp(svc_tree->root_node->svc_data->sub_uri, "root") == 0){
@@ -90,10 +112,8 @@ bool addServiceNode(service_tree_t *svc_tree, const char 
*uri, void *svc) {
 
     service_tree_node_t *current = svc_tree->root_node;
     service_node_data_t *current_data = current->svc_data;
-    while (req_uri != NULL) {
-        char *tmp_save_ptr = save_ptr;
-        char *next_token = strtok_r(NULL, "/", &tmp_save_ptr);
-        bool is_last_entry = next_token == NULL;
+    while (req_uri != NULL && subNodeCount <= tokenCount) {
+        bool is_last_entry = (tokenCount == subNodeCount);
         if (strcmp(current_data->sub_uri, req_uri) == 0) {
             if (is_last_entry) {
                 //Entry already exists/added in tree
@@ -112,11 +132,8 @@ bool addServiceNode(service_tree_t *svc_tree, const char 
*uri, void *svc) {
             } else {
                 //Parent has no sub URIs registered yet
                 req_uri = strtok_r(NULL, "/", &save_ptr);
-                tmp_save_ptr = save_ptr;
-                next_token = strtok_r(NULL, "/", &tmp_save_ptr);
-                is_last_entry = next_token == NULL;
-                service_tree_node_t *node = createServiceNode(current, NULL, 
NULL, NULL,
-                                                              req_uri, 
(is_last_entry ? svc : NULL));
+                //Create svc node without svc pointer, this will be added 
later if needed.
+                service_tree_node_t *node = createServiceNode(current, NULL, 
NULL, NULL, req_uri, NULL);
                 current->children = node;
                 current = node;
                 current_data = node->svc_data;
@@ -136,6 +153,7 @@ bool addServiceNode(service_tree_t *svc_tree, const char 
*uri, void *svc) {
             svc_tree->tree_node_count++;
             uri_exists = false;
         }
+        subNodeCount++;
     }
 
     //Increment tree service count if URI exists (only one service can be 
added at once)
diff --git a/bundles/http_admin/http_admin/src/service_tree.h 
b/bundles/http_admin/http_admin/src/service_tree.h
index c7aaed9..a023776 100644
--- a/bundles/http_admin/http_admin/src/service_tree.h
+++ b/bundles/http_admin/http_admin/src/service_tree.h
@@ -51,7 +51,6 @@ typedef struct service_tree {
 } service_tree_t;
 
 //Global function prototypes
-service_tree_node_t *createServiceNode(service_tree_node_t *parent, 
service_tree_node_t *children, service_tree_node_t *next, service_tree_node_t 
*prev, const char *uri, void *svc);
 bool addServiceNode(service_tree_t *svc_tree, const char *uri, void *svc);
 void destroyChildrenFromServiceNode(service_tree_node_t *parent, int 
*tree_item_count, int *tree_svc_count);
 void destroyServiceNode(service_tree_t *svc_tree, service_tree_node_t *node, 
int *tree_item_count, int *tree_svc_count);

Reply via email to