1+ #! /usr/bin/env bash
2+
3+ # Executes selected anomaly detection Cypher queries for GraphViz visualization.
4+ # Visualizes top ranked anomaly archetypes.
5+ # 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/anomaly-detection/{language}_{codeUnit}.
7+
8+ # Requires executeQueryFunctions.sh, visualizeQueryResults.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+ ANOMALY_DETECTION_GRAPHS_DIR=${REPORTS_SCRIPT_DIR:- $( CDPATH=. cd -- " $( dirname -- " ${BASH_SOURCE[0]} " ) " && pwd -P )}
21+ # echo "anomalyDetectionGraphVisualization: ANOMALY_DETECTION_GRAPHS_DIR=${ANOMALY_DETECTION_GRAPHS_DIR}"
22+
23+ # Get the "scripts" directory by taking the path of this script and going one directory up.
24+ SCRIPTS_DIR=${SCRIPTS_DIR:- " ${ANOMALY_DETECTION_GRAPHS_DIR} /../../../scripts" } # Repository directory containing the shell scripts
25+ # echo "anomalyDetectionGraphVisualization: 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 "anomalyDetectionGraphVisualization: VISUALIZATION_SCRIPTS_DIR=${VISUALIZATION_SCRIPTS_DIR}"
30+
31+ # Define functions to execute cypher queries from within a given file
32+ source " ${SCRIPTS_DIR} /executeQueryFunctions.sh"
33+
34+ # Runs a parametrized query, converts their results in GraphViz format and creates a Graph visualization.
35+ # Outputs (at most) 10 indexed files (for report_name="TopHub" then TopHub1, TopHub2,...) with a focused visualization of one selected node and its surroundings.
36+ #
37+ # Required Parameters:
38+ # - report_name=...
39+ # Name of the query, the template and then also the resulting visualization file.
40+ # - projection_language=...
41+ # Name of the associated programming language. Examples: "Java", "Typescript"
42+ # - projection_node_label=...
43+ # Label of the nodes that will be used for the projection. Example: "Package"
44+ create_graph_visualization () {
45+ local nodeLabel
46+ nodeLabel=$( extractQueryParameter " projection_node_label" " ${@ } " )
47+
48+ local language
49+ language=$( extractQueryParameter " projection_language" " ${@ } " )
50+
51+ local report_name
52+ report_name=$( extractQueryParameter " report_name" " ${@ } " )
53+
54+ echo " anomalyDetectionGraphVisualization: $( date +' %Y-%m-%dT%H:%M:%S%z' ) Creating ${language} ${nodeLabel} ${report_name} visualizations..."
55+
56+ local detail_report_directory_name=" ${language} _${nodeLabel} "
57+ local detail_report_directory=" ${FULL_REPORT_DIRECTORY} /${detail_report_directory_name} /GraphVisualizations"
58+ mkdir -p " ${detail_report_directory} "
59+
60+ # TODO output all 10 indices
61+ for index in {1..2}; do
62+ # Query Graph data
63+ local resultFileName=" ${detail_report_directory} /${report_name}${index} "
64+ local queryResultFile=" ${resultFileName} .csv"
65+ execute_cypher " ${ANOMALY_DETECTION_GRAPHS_DIR} /${report_name} .cypher" " ${@ } " " projection_node_rank=${index} " > " ${queryResultFile} " || true
66+
67+ # Remove empty files
68+ # Note: After that, detail_report_directory might be deleted as well.
69+ # In that case the image generation is finished and the loop needs to be terminated.
70+ source " ${SCRIPTS_DIR} /cleanupAfterReportGeneration.sh" " ${detail_report_directory} "
71+ # Stop generation as soon as the first query result is empty or the directory is deleted.
72+ if [ ! -f " ${queryResultFile} " ] ; then
73+ break ;
74+ fi
75+
76+ # Generate svg image using GraphViz
77+ source " ${VISUALIZATION_SCRIPTS_DIR} /visualizeQueryResults.sh" " ${queryResultFile} " --template " ${ANOMALY_DETECTION_GRAPHS_DIR} /TopHub.template.gv"
78+
79+ # Clean up after graph visualization image generation:
80+ rm -rf " ${queryResultFile} " # Remove query result # TODO reactive cleanup
81+ # Collect graphviz files in a "graphviz" sub directory
82+ mkdir -p " ${detail_report_directory} /graphviz"
83+ mv -f " ${resultFileName} .gv" " ${detail_report_directory} /graphviz"
84+
85+ # Create visualization reference Markdown file to be embeddable in main Markdown report
86+ if [ " ${index} " == " 1" ]; then
87+ {
88+ echo " "
89+ echo " ##### ${language} ${nodeLabel} - ${report_name} Graph Visualizations"
90+ echo " "
91+ } > " ${detail_report_directory} /VisualizationsReference.md"
92+ fi
93+ echo " " >> " ${detail_report_directory} /VisualizationsReference.md"
94+ done
95+ }
96+
97+ # Run queries, outputs their results in GraphViz format and create Graph visualizations.
98+ #
99+ # Required Parameters:
100+ # - projection_language=...
101+ # Name of the associated programming language. Examples: "Java", "Typescript"
102+ # - projection_node_label=...
103+ # Label of the nodes that will be used for the projection. Example: "Package"
104+ anomaly_detection_graph_visualization () {
105+
106+ create_graph_visualization " report_name=TopHub" " ${@ } "
107+
108+ }
109+
110+
111+ # Create report directory
112+ REPORT_NAME=" anomaly-detection"
113+ FULL_REPORT_DIRECTORY=" ${REPORTS_DIRECTORY} /${REPORT_NAME} "
114+ mkdir -p " ${FULL_REPORT_DIRECTORY} "
115+
116+ # Query Parameter key pairs for projection and algorithm side
117+ QUERY_NODE=" projection_node_label"
118+ QUERY_LANGUAGE=" projection_language"
119+
120+ # -- Detail Reports for each code type -------------------------------
121+
122+ # TODO output all types
123+ # anomaly_detection_graph_visualization "${QUERY_NODE}=Artifact" "${QUERY_LANGUAGE}=Java"
124+ anomaly_detection_graph_visualization " ${QUERY_NODE} =Package" " ${QUERY_LANGUAGE} =Java"
125+ # anomaly_detection_graph_visualization "${QUERY_NODE}=Type" "${QUERY_LANGUAGE}=Java"
126+ # anomaly_detection_graph_visualization "${QUERY_NODE}=Module" "${QUERY_LANGUAGE}=Typescript"
127+
128+ # ---------------------------------------------------------------
129+
130+ echo " anomalyDetectionGraphVisualization: $( date +' %Y-%m-%dT%H:%M:%S%z' ) Successfully finished."
0 commit comments