You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by er...@apache.org on 2021/11/25 20:18:36 UTC

[celix] branch dm_cmd_with_plantuml_output created (now 9b812c0)

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

erjanaltena pushed a change to branch dm_cmd_with_plantuml_output
in repository https://gitbox.apache.org/repos/asf/celix.git.


      at 9b812c0  Added an extra output to the DM shell command which generates plantuml output to quickly see the resolved and not-resolved dependencies

This branch includes the following new commits:

     new 9b812c0  Added an extra output to the DM shell command which generates plantuml output to quickly see the resolved and not-resolved dependencies

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[celix] 01/01: Added an extra output to the DM shell command which generates plantuml output to quickly see the resolved and not-resolved dependencies

Posted by er...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9b812c08e0f8f8b46292992f41d7d28ff6b5d1d5
Author: Erjan Altena <er...@gmail.com>
AuthorDate: Thu Nov 25 21:18:24 2021 +0100

    Added an extra output to the DM shell command which generates plantuml output to quickly see the resolved and not-resolved dependencies
---
 bundles/shell/shell/src/dm_shell_list_command.c    | 174 ++++++++++++++++-----
 .../dm_example_cxx/api/include/IPhase1.h           |   1 +
 2 files changed, 140 insertions(+), 35 deletions(-)

diff --git a/bundles/shell/shell/src/dm_shell_list_command.c b/bundles/shell/shell/src/dm_shell_list_command.c
index df1fdca..ce8b722 100644
--- a/bundles/shell/shell/src/dm_shell_list_command.c
+++ b/bundles/shell/shell/src/dm_shell_list_command.c
@@ -30,7 +30,20 @@ static const char * const WARNING_COLOR = "\033[93m";
 static const char * const NOK_COLOR = "\033[91m";
 static const char * const END_COLOR = "\033[m";
 
-static void parseCommandLine(const char*line, celix_array_list_t **requestedBundleIds, bool *fullInfo, bool *wtf, FILE *err) {
+void printInactiveBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors);
+
+void printSpecifiedBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors, bool fullInfo, bool plantUmlInfo);
+
+void printAllBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors, const celix_array_list_t *bundleIds,
+                     bool fullInfo, bool plantUmlInfo);
+
+static void printPlantUmlInfo(FILE *out, celix_dependency_manager_t *mng);
+static void printUmlComponents(FILE *out, const celix_array_list_t *infos);
+
+static void printUmlDependencies(FILE *out, const celix_array_list_t *infos);
+
+
+static void parseCommandLine(const char*line, celix_array_list_t **requestedBundleIds, bool *fullInfo, bool *plantUmlInfo, bool *wtf, FILE *err) {
     *fullInfo = false;
     *wtf = false;
     char *str = strdup(line);
@@ -43,6 +56,8 @@ static void parseCommandLine(const char*line, celix_array_list_t **requestedBund
             *wtf = true;
         } else if (tok[0] == 'f') { // f or full argument => show full info
             *fullInfo = true;
+        } else if (tok[0] == 'u') { // u or full plant UML syntax output =>copy paste in a file java -jar plantuml.jar <file> gives a nice dependency graph
+            *plantUmlInfo = true;
         } else if ( (tok[0] >= '0') && (tok[0] <= '9')) { // bundle id
             long id = strtol(tok, NULL, 10);
             celix_arrayList_addLong(*requestedBundleIds, id);
@@ -102,6 +117,74 @@ static void printFullInfo(FILE *out, bool colors, long bundleId, const char* bnd
     fprintf(out, "\n");
 
 }
+static void printPlantUmlInfo(FILE *out, celix_dependency_manager_t *mng) {
+
+    celix_array_list_t *infos = celix_dependencyManager_createInfos(mng);
+
+    fprintf(out, "@startuml\n");
+
+    printUmlComponents(out, infos);
+    printUmlDependencies(out, infos);
+
+    fprintf(out, "@enduml\n");
+}
+
+static void printUmlComponents(FILE *out, const celix_array_list_t *infos) {
+    unsigned int nof_bundles = celix_arrayList_size(infos);
+    for (int bnd = 0; bnd < nof_bundles; ++bnd) {
+        celix_dependency_manager_info_t *info = celix_arrayList_get(infos, bnd);
+        for (int cmpCnt = 0; cmpCnt < celix_arrayList_size(info->components); ++cmpCnt) {
+            celix_dm_component_info_t *compInfo = celix_arrayList_get(info->components, cmpCnt);
+            fprintf(out, "class %s\n", compInfo->name);
+            for (int interfCnt = 0; interfCnt < celix_arrayList_size(compInfo->interfaces); interfCnt++) {
+                dm_interface_info_pt intfInfo = celix_arrayList_get(compInfo->interfaces, interfCnt);
+                fprintf(out, "interface %s\n", intfInfo->name);
+            }
+        }
+    }
+    // depdencies at last, since the type overwrites the interface for a nice graph
+    for (int bnd = 0; bnd < nof_bundles; ++bnd) {
+        celix_dependency_manager_info_t *info = celix_arrayList_get(infos, bnd);
+        for (int cmpCnt = 0; cmpCnt < celix_arrayList_size(info->components); ++cmpCnt) {
+            celix_dm_component_info_t *compInfo = celix_arrayList_get(info->components, cmpCnt);
+            for (int depCnt = 0; depCnt < celix_arrayList_size(compInfo->dependency_list); ++depCnt) {
+                dm_service_dependency_info_pt dependency;
+                dependency = celix_arrayList_get(compInfo->dependency_list, depCnt);
+                fprintf(out, "interface %s\n", dependency->serviceName);
+            }
+        }
+    }
+    fprintf(out, "\n");
+}
+
+
+static void printUmlDependencies(FILE *out, const celix_array_list_t *infos) {
+    unsigned int nof_bundles = celix_arrayList_size(infos);
+
+    // Now print the UML relations
+    for (int bnd = 0; bnd < nof_bundles; ++bnd) {
+        celix_dependency_manager_info_t *info = celix_arrayList_get(infos, bnd);
+        for (int cmpCnt = 0; cmpCnt < celix_arrayList_size(info->components); ++cmpCnt) {
+            celix_dm_component_info_t *compInfo = celix_arrayList_get(info->components, cmpCnt);
+            for (int interfCnt = 0; interfCnt < celix_arrayList_size(compInfo->interfaces); interfCnt++) {
+                dm_interface_info_pt intfInfo = celix_arrayList_get(compInfo->interfaces, interfCnt);
+                fprintf(out, "%s --|> %s\n", compInfo->name, intfInfo->name);
+            }
+            for (int depCnt = 0; depCnt < celix_arrayList_size(compInfo->dependency_list); ++depCnt) {
+                dm_service_dependency_info_pt dependency;
+                dependency = celix_arrayList_get(compInfo->dependency_list, depCnt);
+                if (dependency->available) {
+                    fprintf(out, "%s *--> %s\n", compInfo->name, dependency->serviceName);
+                } else if (dependency->required) {
+                    fprintf(out, "%s *..> %s\n", compInfo->name, dependency->serviceName);
+                } else {
+                    fprintf(out, "%s ..> %s\n", compInfo->name, dependency->serviceName);
+                }
+            }
+        }
+    }
+}
+
 
 static void printBasicInfo(FILE *out, bool colors, long bundleId, const char* bndName, dm_component_info_pt compInfo) {
     const char *startColors = "";
@@ -119,7 +202,7 @@ static void dm_printInfo(FILE *out, bool useColors, bool fullInfo, celix_depende
     if (info != NULL) {
         int size = celix_arrayList_size(info->components);
         if (size > 0) {
-            for (unsigned int cmpCnt = 0; cmpCnt < size; cmpCnt++) {
+            for ( int cmpCnt = 0; cmpCnt < size; cmpCnt++) {
                 dm_component_info_pt compInfo = celix_arrayList_get(info->components, cmpCnt);
                 if (fullInfo) {
                     printFullInfo(out, useColors, info->bndId, info->bndSymbolicName, compInfo);
@@ -128,6 +211,7 @@ static void dm_printInfo(FILE *out, bool useColors, bool fullInfo, celix_depende
                 }
             }
             fprintf(out, "\n");
+
         }
     }
 }
@@ -142,48 +226,68 @@ celix_status_t dmListCommand_execute(void* handle, char * line, FILE *out, FILE
 
     celix_array_list_t *bundleIds = NULL;
     bool fullInfo = false;
+    bool plantUmlInfo = false;
     bool wtf = false;
-    parseCommandLine(line, &bundleIds, &fullInfo, &wtf, err);
+    parseCommandLine(line, &bundleIds, &fullInfo, &plantUmlInfo, &wtf, err);
 
     if (wtf) {
-        //only print dm that are not active
-        bool allActive = true;
-        int nrOfComponents = 0;
-        celix_array_list_t *infos = celix_dependencyManager_createInfos(mng);
-        for (int i = 0; i < celix_arrayList_size(infos); ++i) {
-            celix_dependency_manager_info_t *info = celix_arrayList_get(infos, i);
-            for (int k = 0; k < celix_arrayList_size(info->components); ++k) {
-                celix_dm_component_info_t *cmpInfo = celix_arrayList_get(info->components, k);
-                nrOfComponents += 1;
-                if (!cmpInfo->active) {
-                    allActive = false;
-                    printFullInfo(out, useColors, info->bndId, info->bndSymbolicName, cmpInfo);
-                }
-            }
-        }
-        celix_dependencyManager_destroyInfos(mng, infos);
-        if (allActive) {
-            fprintf(out, "No problem all %i dependency manager components are active\n", nrOfComponents);
-        }
+        printInactiveBundles(out, mng, useColors);
+    } else if (plantUmlInfo) {
+        printPlantUmlInfo(out, mng);
     } else if (celix_arrayList_size(bundleIds) == 0) {
-        celix_array_list_t *infos = celix_dependencyManager_createInfos(mng);
+        printSpecifiedBundles(out, mng, useColors, fullInfo, plantUmlInfo);
+    } else {
+        printAllBundles(out, mng, useColors, bundleIds, fullInfo, plantUmlInfo);
+    }
+
+    celix_arrayList_destroy(bundleIds);
+
+    return CELIX_SUCCESS;
+}
+
+void printAllBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors, const celix_array_list_t *bundleIds,
+                     bool fullInfo, bool plantUmlInfo) {
+    for (int i = 0; i < celix_arrayList_size(bundleIds); ++i) {
+        long bndId = celix_arrayList_getLong(bundleIds, i);
+        celix_dependency_manager_info_t *info = celix_dependencyManager_createInfo(mng, bndId);
+        if (info != NULL) {
+            dm_printInfo(out, useColors, fullInfo, info);
+            celix_dependencyManager_destroyInfo(mng, info);
+        }
+    }
+}
+
+void printSpecifiedBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors, bool fullInfo, bool plantUmlInfo) {
+    celix_array_list_t *infos = celix_dependencyManager_createInfos(mng);
+    if (plantUmlInfo) {
+        printPlantUmlInfo(out, mng);
+    } else {
         for (int i = 0; i < celix_arrayList_size(infos); ++i) {
             celix_dependency_manager_info_t *info = celix_arrayList_get(infos, i);
             dm_printInfo(out, useColors, fullInfo, info);
         }
-        celix_dependencyManager_destroyInfos(mng, infos);
-    } else {
-        for (int i = 0; i < celix_arrayList_size(bundleIds); ++i) {
-            long bndId = celix_arrayList_getLong(bundleIds, i);
-            celix_dependency_manager_info_t *info = celix_dependencyManager_createInfo(mng, bndId);
-            if (info != NULL) {
-                dm_printInfo(out, useColors, fullInfo, info);
-                celix_dependencyManager_destroyInfo(mng, info);
+    }
+    celix_dependencyManager_destroyInfos(mng, infos);
+}
+
+void
+printInactiveBundles(FILE *out, celix_dependency_manager_t *mng, bool useColors) {//only print dm that are not active
+    bool allActive = true;
+    int nrOfComponents = 0;
+    celix_array_list_t *infos = celix_dependencyManager_createInfos(mng);
+    for (int i = 0; i < celix_arrayList_size(infos); ++i) {
+        celix_dependency_manager_info_t *info = celix_arrayList_get(infos, i);
+        for (int k = 0; k < celix_arrayList_size(info->components); ++k) {
+            celix_dm_component_info_t *cmpInfo = celix_arrayList_get(info->components, k);
+            nrOfComponents += 1;
+            if (!cmpInfo->active) {
+                allActive = false;
+                printFullInfo(out, useColors, info->bndId, info->bndSymbolicName, cmpInfo);
             }
         }
     }
-
-    celix_arrayList_destroy(bundleIds);
-
-    return CELIX_SUCCESS;
+    celix_dependencyManager_destroyInfos(mng, infos);
+    if (allActive) {
+        fprintf(out, "No problem all %i dependency manager components are active\n", nrOfComponents);
+    }
 }
diff --git a/examples/celix-examples/dm_example_cxx/api/include/IPhase1.h b/examples/celix-examples/dm_example_cxx/api/include/IPhase1.h
index c9db5e4..eb3ebd6 100644
--- a/examples/celix-examples/dm_example_cxx/api/include/IPhase1.h
+++ b/examples/celix-examples/dm_example_cxx/api/include/IPhase1.h
@@ -30,4 +30,5 @@ public:
     virtual int getData() = 0;
 };
 
+
 #endif //CELIX_PHASE1_H