#+TITLE: JavaInspect - Utility to visualize java software
-----
- [[http://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz][download latest snapshot]]
- This program is free software; you can redistribute it and/or modify
it under the terms of version 3 of the [[https://www.gnu.org/licenses/lgpl.html][GNU Lesser General Public
License]] or later as published by the Free Software Foundation.
- Program author:
- Svjatoslav Agejenko
- Homepage: http://svjatoslav.eu
- Email: mailto://svjatoslav@svjatoslav.eu
- [[http://svjatoslav.eu/programs.jsp][other applications hosted at svjatoslav.eu]]
* General
Goal: simplify/speed up understanding the computer program code by
automatically visualizing its structure.
JavaInspect is a Java library that primarily uses Java reflection to
discover and visualize any part of Java program provided that
classes to be visualised are available in the classpath.
JavaInspect currently has no GUI, configuration files, embedded
scripting support, direct Maven or Ant integration. The only way to
instuct Javainspect what to do is by using its Java API.
To get JavaInspect into same classpath with your projecs I so far came
up with 2 solutions:
1. Add JavaInspect library in your project as a dependency.
2. Create new Java project for the purpose visualizing your other
projects and include JavaInspect and your projecs binary artifacts
(Jar's) into new project classpath. Built binary Jar's (with no
source code) are sufficient because JavaInspect operates via
reflection.
After discovering application structure and optionally filtering out
unimportant parts, JavaInspect produces GraphViz dot file that
describes data to be visualized. Then launches GraphViz to generate
bitmap graph in PNG format. By default on your Desktop directory.
Note: GraphViz is developed and tested so far only on GNU Linux.
* Example graphs
+ A very simple example:
[[file:example.png][file:example.resized.png]]
Graph legend:
file:legend.png
+ Example visualization of [[http://www2.svjatoslav.eu/gitbrowse/sixth/doc/][Sixth]] project: [[http://www2.svjatoslav.eu/projects/sixth/codegraphs/][architecture graphs]].
* Usage
Currently the only way to control JavaInspect is by using Java
API. Simple Java based control/configuration code needs to be written
for each project. I usually put such code into directories devoted for
JUnit tests. Because it needs not to be compiled/embedded into final
product or project artifact I'm just willing to visualize.
Control code in general does the following:
1. Create graph object.
2. Java reflection/classloaders does not provide mechanism for
discovering all classes under given package. Therefore you need to
declare at least some classes to be added to the graph by:
+ Manually adding individual classes to the graph.
+ and/or: Let GraphViz recursively scan and parse specified
directories with Java source code files to discover class names.
+ For every class added to the graph, GraphViz will recursively
inspect it and add all referecned classes to the graph as well.
3. Graphs easilly get very big and complex so optionally we filter
important code using classname wildcards patterns based blacklist
and/or whitelist.
4. Optionally we can tune some rendering parameters like:
+ Possibility to remove orphaned classes (classes with no
references) from the graph.
+ Specify target directory for generated visualization
files. (Default is user desktop directory)
+ Keep intermediate GraphViz dot file for later inspection.
5. Render graph.
** example 1: individually picked objects
This example demonstrates generating of class graph from hand picked
classes and visualizing GraphViz itself.
#+BEGIN_SRC java
// Create graph
final ClassGraph graph = new ClassGraph();
// Add some random object to the graph. GraphViz will detect Class from
// the object.
graph.add(graph);
// Also add some random class to the graph.
graph.add(Utils.class);
// Keep intermediary GraphViz DOT file for reference.
graph.setKeepDotFile(true);
// Produce bitmap image titled "JavaInspect.png" to the user Desktop
// directory
graph.generateGraph("JavaInspect");
#+END_SRC
Note: if desired, more compact version of the above:
#+BEGIN_SRC java
new ClassGraph().add(randomObject, RandomClass.class)
.setKeepDotFile(true).generateGraph("JavaInspect");
#+END_SRC
Result:
- Generated DOT file: [[file:JavaInspect.dot][JavaInspect.dot]]
- Generated PNG image: [[file:JavaInspect.png][JavaInspect.png]]
** example 2: scan java code, apply filters
#+BEGIN_SRC java
// Create graph
final ClassGraph graph = new ClassGraph();
// Recursively scan current directory for Java source code and attempt
// to detect class names from there to be added to the graph.
graph.addProject(".");
// Blacklist example classes from being shown on the graph
graph.blacklistClassPattern("eu.svjatoslav.inspector.java.structure.example.*");
// do not show single classes with no relationships on the graph
graph.hideOrphanedClasses();
// Produce bitmap image titled "JavaInspect full project.png" to the
// user Desktop directory.
graph.generateGraph("JavaInspect full project");
#+END_SRC
Result:
- Generated PNG image: [[file:JavaInspect%20full%20project.png][JavaInspect full project.png]]
** example 3: GraphViz embedded in another project
1. Download project Sixth [[http://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz][code snapshot]].
2. Inspect and run *DataGraph.java*.
* Embedding JavaInspect in your Maven project
Declare JavaInspect as dependency:
#+BEGIN_SRC xml
...
eu.svjatoslav
javainspect
1.5-SNAPSHOT
...
#+END_SRC
Add Maven repository to retrieve artifact from:
#+BEGIN_SRC xml
...
svjatoslav.eu
Svjatoslav repository
http://www2.svjatoslav.eu/maven/
...
#+END_SRC
* Requirements
[[http://www.graphviz.org/][GraphViz]] - shall be installed on the computer.
On Ubuntu/Debian use:
#+BEGIN_SRC sh
sudo apt-get install graphviz
#+END_SRC
* TO DO
- BUG: Should not hide references if there are too many of them to
classes if referring classes are not visible anyway because of
blacklist/whitelist rules. Basically reference counting should
exclude not visible classes.
- FEATURE: add dark theme
- FEATURE: sort Class fields by alphabet
- FEATURE: visualize also concrete field values so it could be used as
ultra cool runtime logging framework
- FEATURE: possibility to visualize structure and data from JVM
snapshot
- FEATURE: possibility to attach to remote process to visualize
data/structure using JVM debug port and mechanism.
- FEATURE: possibility to attach to JVM using JVM agent
- FEATURE: possibility to script javainspect behavior
- FEATURE: possibility to select classes/fields/values to be
visualized in SQL like syntax
- FEATURE: configurable maven plugin to generate graphs as part of the
project build/release process