Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add layers visualization #38

Open
wants to merge 24 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f5a1903
Removed ProjectFile concept
SebastianWendorf Sep 30, 2019
41997dd
add publications
rmllr Jan 29, 2020
d64d81f
Merge pull request #32 from SebastianWendorf/decouple-from-git
rmllr Jun 10, 2020
1c40fd0
Merge pull request #35 from softvis-research/development
rmllr Jun 10, 2020
e5b4b29
Tidy Tree Visualization
jeremypuchta Jul 15, 2020
2dacc0d
Sample visualization of collapsible tree
jeremypuchta Jul 15, 2020
b06c4d0
Visualization of d3 indented tree
jeremypuchta Jul 21, 2020
edffb3c
visualization with react-d3-tree
jeremypuchta Jul 21, 2020
f9db22f
nivo network layer visualization without dependencies
jeremypuchta Aug 5, 2020
d0e8f3b
Implement visualization - nivo/network with dependencies between classes
jeremypuchta Aug 5, 2020
775323e
Current state
jeremypuchta Aug 8, 2020
2af20f7
Change color scheme
jeremypuchta Aug 11, 2020
fe9884d
Visualize invalid dependencies between layers
jeremypuchta Aug 11, 2020
f2f68cc
Implementation of Tree
jeremypuchta Aug 12, 2020
f67e737
Display all Dependencies in Tree. Switching to HTML component in orde…
jeremypuchta Aug 14, 2020
1352992
Implementation of Treebeard component. Invalid Dependencies get highl…
jeremypuchta Aug 18, 2020
50fd1a2
Valid and invalid dependencies are highlighted in tree view
jeremypuchta Aug 19, 2020
47a9a49
Refactoring
jeremypuchta Aug 19, 2020
a57c35b
Implement dependency definition query with :DEFINES_DEPENDENCY relati…
jeremypuchta Aug 21, 2020
9924f90
Highlight respective bubbles on hover in tree
jeremypuchta Aug 24, 2020
fbcfc3a
Lexicographical ordering of tree nodes
jeremypuchta Aug 26, 2020
34fb96a
Highlight invalid bubbles
jeremypuchta Aug 31, 2020
f29c75c
Error handling. Change Routes.
jeremypuchta Aug 31, 2020
0ba7d1c
Cleanup
jeremypuchta Aug 31, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,11 @@ $ docker run -it -p 7474:7474 -p 7687:7687 visualsoftwareanalytics/jqa-dashboard
* [React Table](https://github.com/react-tools/react-table)
* [Graph App Kit](https://github.com/neo4j-apps/graph-app-kit)
* [Neo4j](https://github.com/neo4j/neo4j)

## Publications ##

* David Baum, Pascal Kovacs, Richard Müller: [Fostering Collaboration of Academia and Industry by Open Source Software](https://www.researchgate.net/publication/338008152_Fostering_Collaboration_of_Academia_and_Industry_by_Open_Source_Software), SE20 Software Engineering, 2020.
* Richard Müller, Dirk Mahler, Michael Hunger, Jens Nerche, Markus Harrer: [Towards an Open Source Stack to Create a Unified Data Source for Software Analysis and Visualization](https://www.researchgate.net/publication/328282991_Towards_an_Open_Source_Stack_to_Create_a_Unified_Data_Source_for_Software_Analysis_and_Visualization), 6th IEEE Working Conference on Software Visualization, 2018.
* Tino Mewes: [Konzeption und prototypische Implementierung eines web-basierten Dashboards zur Softwarevisualisierung](http://nbn-resolving.de/urn:nbn:de:bsz:15-qucosa2-323826), Masterarbeit, 2018.

A full list of publications you can find on [our website](http://home.uni-leipzig.de/svis/Publications/).
12 changes: 0 additions & 12 deletions data/jqassistant/dashboard.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -145,15 +145,3 @@ RETURN
ORDER BY
FilesOfType desc
----

[[jqassistant-dashboard:ProjectFile]]
[source,cypher,role="concept",verify="aggregation"]
.Every `:Type` which is contained in an artifact is labeled as `:ProjectFile`.
----
MATCH
(:Artifact)-[:CONTAINS]->(t:Type)
SET
t:ProjectFile
RETURN
count(t) as NumberOfProjectFiles
----
4 changes: 2 additions & 2 deletions data/junit/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM neo4j:latest
FROM neo4j:3.5

ENV NEO4J_PASSWD neo4j
ENV NEO4J_AUTH neo4j/${NEO4J_PASSWD}
Expand All @@ -12,4 +12,4 @@ CMD sed -e 's/^#dbms.read_only=.*$/dbms.read_only=true/' -i /var/lib/neo4j/conf/
bin/neo4j-admin set-initial-password ${NEO4J_PASSWD} || true && \
bin/neo4j-admin load --from=/var/lib/neo4j/import/junit.dump --force && \
bin/neo4j start && sleep 5 && \
tail -f logs/neo4j.log
tail -f logs/neo4j.log
6 changes: 3 additions & 3 deletions data/petclinic/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM neo4j:latest
FROM neo4j:3.5

ENV NEO4J_PASSWD neo4j
ENV NEO4J_AUTH neo4j/${NEO4J_PASSWD}
Expand All @@ -7,9 +7,9 @@ COPY petclinic.dump /var/lib/neo4j/import/

VOLUME /data

CMD sed -e 's/^#dbms.read_only=.*$/dbms.read_only=true/' -i /var/lib/neo4j/conf/neo4j.conf && \
CMD sed -e 's/^#dbms.read_only=.*$/dbms.read_only=false/' -i /var/lib/neo4j/conf/neo4j.conf && \
mkdir -p /var/lib/neo4j/data/databases/graph.db && \
bin/neo4j-admin set-initial-password ${NEO4J_PASSWD} || true && \
bin/neo4j-admin load --from=/var/lib/neo4j/import/petclinic.dump --force && \
bin/neo4j start && sleep 5 && \
tail -f logs/neo4j.log
tail -f logs/neo4j.log
70 changes: 37 additions & 33 deletions src/_nav.js
Original file line number Diff line number Diff line change
@@ -1,73 +1,77 @@
export default {
items: [
{
name: 'Dashboard',
url: '/dashboard',
icon: 'icon-speedometer'
name: "Dashboard",
url: "/dashboard",
icon: "icon-speedometer"
},
{
name: 'Architecture',
url: '/architecture',
icon: 'fa fa-sitemap',
name: "Architecture",
url: "/architecture",
icon: "fa fa-sitemap",
children: [
{
name: 'Structure',
url: '/architecture/structure'
name: "Structure",
url: "/architecture/structure"
},
{
name: 'File Types',
url: '/architecture/file-types'
name: "File Types",
url: "/architecture/file-types"
},
{
name: 'Dependencies',
url: '/architecture/dependencies'
name: "Dependencies",
url: "/architecture/dependencies"
},
{
name: "Layers",
url: "/architecture/layers"
}
]
},
{
name: 'Resource Management',
url: '/resource-management',
icon: 'icon-people',
name: "Resource Management",
url: "/resource-management",
icon: "icon-people",
children: [
{
name: 'Activity',
url: '/resource-management/activity'
name: "Activity",
url: "/resource-management/activity"
},
{
name: 'Knowledge Distribution',
url: '/resource-management/knowledge-distribution'
name: "Knowledge Distribution",
url: "/resource-management/knowledge-distribution"
}
]
},
{
name: 'Risk Management',
url: '/risk-management',
icon: 'fa fa-exclamation-triangle',
name: "Risk Management",
url: "/risk-management",
icon: "fa fa-exclamation-triangle",
children: [
{
name: 'Hotspots',
url: '/risk-management/hotspots'
name: "Hotspots",
url: "/risk-management/hotspots"
}
]
},
{
name: 'Quality Management',
url: '/quality-management',
icon: 'icon-badge',
name: "Quality Management",
url: "/quality-management",
icon: "icon-badge",
children: [
{
name: 'Static Code Analysis',
url: '/quality-management/static-code-analysis',
name: "Static Code Analysis",
url: "/quality-management/static-code-analysis",
children: [
{
name: 'PMD',
url: '/quality-management/static-code-analysis/pmd'
name: "PMD",
url: "/quality-management/static-code-analysis/pmd"
}
]
},
{
name: 'Test Coverage',
url: '/quality-management/test-coverage'
name: "Test Coverage",
url: "/quality-management/test-coverage"
}
]
}
Expand Down
16 changes: 8 additions & 8 deletions src/api/models/Dashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ class DashboardModel {
"OPTIONAL MATCH (t:Type:Annotation) " +
"WITH classes, interfaces, enums, count(t) as annotations " +
// number of methods and lines of code
"OPTIONAL MATCH (t:Type:ProjectFile)-[:DECLARES]->(m:Method) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[:DECLARES]->(m:Method) " +
"WITH classes, interfaces, enums, annotations, count(m) as methods, sum(m.effectiveLineCount) as loc " +
// number of fields
"OPTIONAL MATCH (t:Type:ProjectFile)-[:DECLARES]->(f:Field) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[:DECLARES]->(f:Field) " +
"RETURN classes, interfaces, enums, annotations, methods, loc, count(f) as fields";

localStorage.setItem(
Expand All @@ -31,23 +31,23 @@ class DashboardModel {
const dashboardDependenciesQuery =
// relation metrics (table 2)
// dependencies
"OPTIONAL MATCH (:Type:ProjectFile)-[d:DEPENDS_ON]->(:Type) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[d:DEPENDS_ON]->(:Type) " +
"WITH count(d) as dependencies " +
// extends
"OPTIONAL MATCH (:Type:ProjectFile)-[e:EXTENDS]->(superType:Type) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[e:EXTENDS]->(superType:Type) " +
'WHERE superType.name <> "Object" ' +
"WITH dependencies, count(e) as extends " +
// implements
"OPTIONAL MATCH (:Type:ProjectFile)-[i:IMPLEMENTS]->(:Type) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[i:IMPLEMENTS]->(:Type) " +
"WITH dependencies, extends, count(i) as implements " +
// calls
"OPTIONAL MATCH (:Type:ProjectFile)-[:DECLARES]->(m:Method)-[i:INVOKES]->(:Method) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[:DECLARES]->(m:Method)-[i:INVOKES]->(:Method) " +
"WITH dependencies, extends, implements, count(i) as invocations " +
// reads
"OPTIONAL MATCH (:Type:ProjectFile)-[:DECLARES]->(m:Method)-[r:READS]->(:Field) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[:DECLARES]->(m:Method)-[r:READS]->(:Field) " +
"WITH dependencies, extends, implements, invocations, count(r) as reads " +
// writes
"OPTIONAL MATCH (:Type:ProjectFile)-[:DECLARES]->(m:Method)-[w:WRITES]->(:Field) " +
"OPTIONAL MATCH (:Artifact)-[:CONTAINS]->(t:Type), (t)-[:DECLARES]->(m:Method)-[w:WRITES]->(:Field) " +
"RETURN dependencies, extends, implements, invocations, reads, count(w) as writes";
localStorage.setItem(
"dashboard_dependencies_original_query",
Expand Down
2 changes: 1 addition & 1 deletion src/api/models/Dependencies.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { neo4jSession } from "../../views/Dashboard/AbstractDashboardComponent";
class DependenciesModel {
constructor(props) {
const dependenciesQuery =
"MATCH (dependent_package:Package)-[:CONTAINS]->(dependent:Type:ProjectFile)-[depends:DEPENDS_ON]->(dependency:Type:ProjectFile)<-[:CONTAINS]-(dependency_package:Package) " +
"MATCH (:Artifact)-[:CONTAINS]->(dependent:Type), (:Artifact)-[:CONTAINS]->(dependency:Type), (dependent_package:Package)-[:CONTAINS]->(dependent)-[depends:DEPENDS_ON]->(dependency)<-[:CONTAINS]-(dependency_package:Package) " +
"WITH dependent_package.fqn as dependent, dependency_package.fqn as dependency, count(dependency) as dependencies " +
"RETURN dependent , dependency, dependencies ORDER BY dependent, dependency";
localStorage.setItem("dependencies_original_query", dependenciesQuery);
Expand Down
1 change: 0 additions & 1 deletion src/api/models/Hotspots.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ class HotspotModel {
flatData
);
cpHelper.normalizeHotspots(hierarchicalData); //this function works by reference

neo4jSession.close();

//normalize the root element
Expand Down
Loading