1+ #! /usr/bin/env bash
2+
3+ # Executes selected "Path_Finding" Cypher queries for GraphViz visualization.
4+ # For example, the Java Artifact and TypeScript Module dependencies with the longest paths are visualized.
5+ # It requires an already running Neo4j graph database with already scanned and analyzed artifacts.
6+ # The reports (csv, dot and svg files) will be written into the sub directory reports/path-finding-visualization.
7+
8+ # Requires executeQueryFunctions.sh, projectionFunctions.sh, cleanupAfterReportGeneration.sh
9+
10+ # Fail on any error ("-e" = exit on first error, "-o pipefail" exist on errors within piped commands)
11+ set -o errexit -o pipefail
12+
13+ # Overrideable Constants (defaults also defined in sub scripts)
14+ REPORTS_DIRECTORY=${REPORTS_DIRECTORY:- " reports" }
15+
16+ # # Get this "scripts/reports" directory if not already set
17+ # Even if $BASH_SOURCE is made for Bourne-like shells it is also supported by others and therefore here the preferred solution.
18+ # CDPATH reduces the scope of the cd command to potentially prevent unintended directory changes.
19+ # This way non-standard tools like readlink aren't needed.
20+ REPORTS_SCRIPT_DIR=${REPORTS_SCRIPT_DIR:- $( CDPATH=. cd -- " $( dirname -- " ${BASH_SOURCE[0]} " ) " && pwd -P )}
21+ echo " PathFindingVisualization: REPORTS_SCRIPT_DIR=${REPORTS_SCRIPT_DIR} "
22+
23+ # Get the "scripts" directory by taking the path of this script and going one directory up.
24+ SCRIPTS_DIR=${SCRIPTS_DIR:- " ${REPORTS_SCRIPT_DIR} /.." } # Repository directory containing the shell scripts
25+ echo " PathFindingVisualization SCRIPTS_DIR=${SCRIPTS_DIR} "
26+
27+ # Get the "scripts/visualization" directory.
28+ VISUALIZATION_SCRIPTS_DIR=${VISUALIZATION_SCRIPTS_DIR:- " ${SCRIPTS_DIR} /visualization" } # Repository directory containing the shell scripts for visualization
29+ echo " PathFindingVisualization VISUALIZATION_SCRIPTS_DIR=${VISUALIZATION_SCRIPTS_DIR} "
30+
31+ # Get the "cypher" directory by taking the path of this script and going two directory up and then to "cypher".
32+ CYPHER_DIR=${CYPHER_DIR:- " ${REPORTS_SCRIPT_DIR} /../../cypher" }
33+ echo " PathFindingVisualization CYPHER_DIR=${CYPHER_DIR} "
34+
35+ PATH_FINDINGS_CYPHER_DIR=" ${CYPHER_DIR} /Path_Finding"
36+
37+ if ! command -v " npx" & > /dev/null ; then
38+ echo " PathFindingVisualization: Error: Command npx (run npm locally) not found. It's needed for Graph visualization with GraphViz." >&2
39+ exit 1
40+ fi
41+
42+ # Define functions to execute cypher queries from within a given file
43+ source " ${SCRIPTS_DIR} /executeQueryFunctions.sh"
44+
45+ # Define functions to create and delete Graph Projections like "createDirectedDependencyProjection"
46+ source " ${SCRIPTS_DIR} /projectionFunctions.sh"
47+
48+ # Create report directory
49+ REPORT_NAME=" path-finding-visualization"
50+ FULL_REPORT_DIRECTORY=" ${REPORTS_DIRECTORY} /${REPORT_NAME} "
51+ mkdir -p " ${FULL_REPORT_DIRECTORY} "
52+
53+ visualizeGraphAndGenerateSvg () {
54+ local name=" ${1} "
55+ echo " PathFindingVisualization: Generating Visualization ${name} ..."
56+ source " ${VISUALIZATION_SCRIPTS_DIR} /convertQueryResultCsvToGraphVizDotFile.sh" --filename " ${name} .csv"
57+
58+ if [ -f " ${name} .gv" ]; then
59+ # Run GraphViz command line interface (CLI) wrapped utilizing WASM (WebAssembly)
60+ # to convert the DOT file to SVG operating system independently.
61+ npx --yes @hpcc-js/
[email protected] -T svg
" ${name} .gv" > " ${name} .svg" 62+ fi
63+ }
64+
65+ # Java Artifacts: Longest Paths Visualization
66+ ARTIFACT_PROJECTION=" dependencies_projection=artifact-path-finding"
67+ ARTIFACT_NODE=" dependencies_projection_node=Artifact"
68+ ARTIFACT_WEIGHT=" dependencies_projection_weight_property=weight"
69+ reportName=" ${FULL_REPORT_DIRECTORY} /JavaArtifactLongestPaths"
70+ if createDirectedDependencyProjection " ${ARTIFACT_PROJECTION} " " ${ARTIFACT_NODE} " " ${ARTIFACT_WEIGHT} " ; then
71+ execute_cypher " ${PATH_FINDINGS_CYPHER_DIR} /Path_Finding_6_Longest_paths_for_graphviz.cypher" " ${ARTIFACT_PROJECTION} " " ${ARTIFACT_NODE} " " ${ARTIFACT_WEIGHT} " > " ${reportName} .csv"
72+ visualizeGraphAndGenerateSvg " ${reportName} "
73+ fi
74+
75+ # TypeScript Modules: Longest Paths Visualization
76+ MODULE_LANGUAGE=" dependencies_projection_language=Typescript"
77+ MODULE_PROJECTION=" dependencies_projection=typescript-module-path-finding"
78+ MODULE_NODE=" dependencies_projection_node=Module"
79+ MODULE_WEIGHT=" dependencies_projection_weight_property=lowCouplingElement25PercentWeight"
80+ reportName=" ${FULL_REPORT_DIRECTORY} /TypeScriptModuleLongestPaths"
81+ if createDirectedDependencyProjection " ${MODULE_LANGUAGE} " " ${MODULE_PROJECTION} " " ${MODULE_NODE} " " ${MODULE_WEIGHT} " ; then
82+ execute_cypher " ${PATH_FINDINGS_CYPHER_DIR} /Path_Finding_6_Longest_paths_for_graphviz.cypher" " ${MODULE_PROJECTION} " " ${MODULE_NODE} " " ${MODULE_WEIGHT} " > " ${reportName} .csv"
83+ visualizeGraphAndGenerateSvg " ${reportName} "
84+ fi
85+
86+ # Clean-up after report generation. Empty reports will be deleted.
87+ source " ${SCRIPTS_DIR} /cleanupAfterReportGeneration.sh" " ${FULL_REPORT_DIRECTORY} "
0 commit comments