X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=doc%2Findex.html;h=4c426bfacab52fe8f2691b2112cfb65eb0777002;hb=92e7df28bd9624ce5d35fac41e7f06f7d23d9217;hp=b3da463deb948fd76018efa53cc87890b0325990;hpb=aa556ce8e3099d7bbd07afe5cd04a482bd4b7938;p=javainspect.git diff --git a/doc/index.html b/doc/index.html index b3da463..4c426bf 100644 --- a/doc/index.html +++ b/doc/index.html @@ -1,144 +1,515 @@ - - - - -JavaInspect - - -

JavaInspect - Utility to visualize java software

- Download -    - Online - homepage    - Other applications - hosted on svjatoslav.eu -
-Program author:
-    Svjatoslav Agejenko
-    Homepage: http://svjatoslav.eu
-    Email: svjatoslav@svjatoslav.eu
-
-This software is distributed under GNU GENERAL PUBLIC LICENSE Version 2.
-
-
- -

General

- - Goal: simplify/speed up understanding the computer program code by - automatically visualizing its structure. - -

- JavaInspect is a Java library that you can embed into your Java project - with a few lines of Maven configuration and then visualize any part of - your Java program structure with few simple JavaInspect API calls at - application runtime. - -
-
JavaInspect uses Java reflection to discover class relations and - structure and produces GraphViz dot file that describes your - application. Then launches GraphViz to generate bitmap graph in PNG - format on your Desktop directory. - - -

Current status

- - This is simple utility, quickly written. Tested on Linux (can be - relatively simply ported to other operating systems too). So far I used - it for my own needs. There might be bugs and missing features. Feedback - and code contributions are welcome. - - -

Example graphs

- - Example visualization of - Sixth - project: - architecture - graphs - -
-
A very simple example: -
- - -
Graph legend: -
- - - -

Usage example

- - Following example produces graph for JavaInspect itself: - -
-
-
-// Create graph
-final ClassGraph graph = new ClassGraph();
-
-// Add some object to the graph.
-graph.addObject(graph);
-
-// Add some class to the graph.
-graph.addClass(Utils.class);
-
-// Produce bitmap image titled "JavaInspect.png" to the user Desktop
-// directory.
-graph.generateGraph("JavaInspect", true);
-
-
-
-Result:
-    Generated DOT file: JavaInspect.dot
-    Generated PNG image: JavaInspect.png
-
-
- - - -

Embedding JavaInspect in your project

-
-
-Declare JavaInspect as dependency:
-
-    <dependencies>
-
-        ...
-
-        <dependency>
-            <groupId>eu.svjatoslav</groupId>
-            <artifactId>javainspect</artifactId>
-            <version>1.0</version>
-        </dependency>
- 
-    </dependencies>
-    
-  
-  
-Add Maven repository to retrieve artifact from:
-  
-    <repositories>
-        <repository>
-            <id>svjatoslav.eu</id>
-            <name>Svjatoslav repository</name>
-            <url>http://www2.svjatoslav.eu/maven/</url>
-        </repository>
-    </repositories>
-
- - - - -

Requirements

- -
- GraphViz - shall be installed on - the computer. - - - - + + + + +JavaInspect - Utility to visualize java software + + + + + + + + + +
+

JavaInspect - Utility to visualize java software

+
+

Table of Contents

+ +
+
+ + +
+

1 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. +
  3. 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. +
  4. +
+ +

+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. +

+
+
+ +
+

2 Example graphs

+
+
    +
  • A very simple example: + + +
    +

    example.resized.png +

    +
    + +

    +Graph legend: +

    + + +
    +

    legend.png +

    +
    +
  • + +
  • Example visualization of Sixth project: architecture graphs. +
  • +
+
+
+ +
+

3 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. +
  3. 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. +
    • +
    +
  4. +
  5. Graphs easilly get very big and complex so optionally we filter +important code using classname wildcards patterns based blacklist +and/or whitelist. +
  6. +
  7. 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. +
    • +
    +
  8. +
  9. Render graph. +
  10. +
+
+ + +
+

3.1 example 1: individually picked objects

+
+

+This example demonstrates generating of class graph from hand picked +classes and visualizing GraphViz itself. +

+ +
+ +
// 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");
+
+
+ +

+Note: if desired, more compact version of the above: +

+
+ +
new ClassGraph().add(randomObject, RandomClass.class)
+                .setKeepDotFile(true).generateGraph("JavaInspect");
+
+
+ + +

+Result: +

+ +
+
+ +
+

3.2 example 2: scan java code, apply filters

+
+
+ +
// 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");
+
+
+

+Result: +

+ +
+
+ +
+

3.3 example 3: GraphViz embedded in another project

+
+
    +
  1. Download project Sixth code snapshot. +
  2. +
  3. Inspect and run DataGraph.java. +
  4. +
+
+
+
+ +
+

4 Embedding JavaInspect in your Maven project

+
+

+Declare JavaInspect as dependency: +

+
+ +
<dependencies>
+    ...
+    <dependency>
+        <groupId>eu.svjatoslav</groupId>
+        <artifactId>javainspect</artifactId>
+        <version>1.5-SNAPSHOT</version>
+    </dependency>
+    ...
+</dependencies>
+
+
+ + +

+Add Maven repository to retrieve artifact from: +

+
+ +
<repositories>
+    ...
+    <repository>
+        <id>svjatoslav.eu</id>
+        <name>Svjatoslav repository</name>
+        <url>http://www2.svjatoslav.eu/maven/</url>
+    </repository>
+    ...
+</repositories>
+
+
+
+
+ +
+

5 Requirements

+
+

+GraphViz - shall be installed on the computer. +

+ +

+On Ubuntu/Debian use: +

+
+ +
sudo apt-get install graphviz
+
+
+
+
+
+

6 TODO

+
+
    +
  • 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 +
  • +
+
+
+
+
+

Author: Svjatoslav Agejenko

+

Created: 2015-03-07 Sat 00:10

+

Emacs 24.4.1 (Org mode 8.2.10)

+

Validate

+
+ +