1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
6 <title>JavaInspect - Utility to visualize java software</title>
7 <!-- 2015-03-03 Tue 22:24 -->
8 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
9 <meta name="generator" content="Org-mode" />
10 <meta name="author" content="Svjatoslav Agejenko" />
11 <style type="text/css">
12 <!--/*--><![CDATA[/*><!--*/
13 .title { text-align: center; }
14 .todo { font-family: monospace; color: red; }
15 .done { color: green; }
16 .tag { background-color: #eee; font-family: monospace;
17 padding: 2px; font-size: 80%; font-weight: normal; }
18 .timestamp { color: #bebebe; }
19 .timestamp-kwd { color: #5f9ea0; }
20 .right { margin-left: auto; margin-right: 0px; text-align: right; }
21 .left { margin-left: 0px; margin-right: auto; text-align: left; }
22 .center { margin-left: auto; margin-right: auto; text-align: center; }
23 .underline { text-decoration: underline; }
24 #postamble p, #preamble p { font-size: 90%; margin: .2em; }
25 p.verse { margin-left: 3%; }
27 border: 1px solid #ccc;
28 box-shadow: 3px 3px 3px #eee;
30 font-family: monospace;
42 background-color: white;
46 border: 1px solid black;
48 pre.src:hover:before { display: inline;}
49 pre.src-sh:before { content: 'sh'; }
50 pre.src-bash:before { content: 'sh'; }
51 pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
52 pre.src-R:before { content: 'R'; }
53 pre.src-perl:before { content: 'Perl'; }
54 pre.src-java:before { content: 'Java'; }
55 pre.src-sql:before { content: 'SQL'; }
57 table { border-collapse:collapse; }
58 caption.t-above { caption-side: top; }
59 caption.t-bottom { caption-side: bottom; }
60 td, th { vertical-align:top; }
61 th.right { text-align: center; }
62 th.left { text-align: center; }
63 th.center { text-align: center; }
64 td.right { text-align: right; }
65 td.left { text-align: left; }
66 td.center { text-align: center; }
67 dt { font-weight: bold; }
68 .footpara:nth-child(2) { display: inline; }
69 .footpara { display: block; }
70 .footdef { margin-bottom: 1em; }
71 .figure { padding: 1em; }
72 .figure p { text-align: center; }
75 border: 2px solid gray;
80 { text-align: right; font-size: 70%; white-space: nowrap; }
81 textarea { overflow-x: auto; }
82 .linenr { font-size: smaller }
83 .code-highlighted { background-color: #ffff00; }
84 .org-info-js_info-navigation { border-style: none; }
85 #org-info-js_console-label
86 { font-size: 10px; font-weight: bold; white-space: nowrap; }
87 .org-info-js_search-highlight
88 { background-color: #ffff00; color: #000000; font-weight: bold; }
91 <link rel="stylesheet" type="text/css" href="http://thomasf.github.io/solarized-css/solarized-dark.min.css" />
92 <script type="text/javascript">
94 @licstart The following is the entire license notice for the
95 JavaScript code in this tag.
97 Copyright (C) 2012-2013 Free Software Foundation, Inc.
99 The JavaScript code in this tag is free software: you can
100 redistribute it and/or modify it under the terms of the GNU
101 General Public License (GNU GPL) as published by the Free Software
102 Foundation, either version 3 of the License, or (at your option)
103 any later version. The code is distributed WITHOUT ANY WARRANTY;
104 without even the implied warranty of MERCHANTABILITY or FITNESS
105 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
107 As additional permission under GNU GPL version 3 section 7, you
108 may distribute non-source (e.g., minimized or compacted) forms of
109 that code without the copy of the GNU GPL normally required by
110 section 4, provided you include this license notice and a URL
111 through which recipients can access the Corresponding Source.
114 @licend The above is the entire license notice
115 for the JavaScript code in this tag.
117 <!--/*--><![CDATA[/*><!--*/
118 function CodeHighlightOn(elem, id)
120 var target = document.getElementById(id);
122 elem.cacheClassElem = elem.className;
123 elem.cacheClassTarget = target.className;
124 target.className = "code-highlighted";
125 elem.className = "code-highlighted";
128 function CodeHighlightOff(elem, id)
130 var target = document.getElementById(id);
131 if(elem.cacheClassElem)
132 elem.className = elem.cacheClassElem;
133 if(elem.cacheClassTarget)
134 target.className = elem.cacheClassTarget;
141 <h1 class="title">JavaInspect - Utility to visualize java software</h1>
142 <div id="table-of-contents">
143 <h2>Table of Contents</h2>
144 <div id="text-table-of-contents">
146 <li><a href="#sec-1">1. General</a></li>
147 <li><a href="#sec-2">2. Example graphs</a></li>
148 <li><a href="#sec-3">3. Usage</a>
150 <li><a href="#sec-3-1">3.1. example 1</a></li>
151 <li><a href="#sec-3-2">3.2. example 2</a></li>
154 <li><a href="#sec-4">4. Embedding JavaInspect in your Maven project</a></li>
155 <li><a href="#sec-5">5. Requirements</a></li>
156 <li><a href="#sec-6">6. <span class="todo TODO">TODO</span> </a></li>
162 <li><a href="http://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz">download latest snapshot</a>
165 <li>This program is free software; you can redistribute it and/or modify
166 it under the terms of version 3 of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public
167 License</a> or later as published by the Free Software Foundation.
172 <li>Svjatoslav Agejenko
174 <li>Homepage: <a href="http://svjatoslav.eu">http://svjatoslav.eu</a>
176 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
181 <li><a href="http://svjatoslav.eu/programs.jsp">other applications hosted at svjatoslav.eu</a>
185 <div id="outline-container-sec-1" class="outline-2">
186 <h2 id="sec-1"><span class="section-number-2">1</span> General</h2>
187 <div class="outline-text-2" id="text-1">
189 Goal: simplify/speed up understanding the computer program code by
190 automatically visualizing its structure.
194 JavaInspect is a Java library that primarily uses Java reflection to
195 discover and visualize any part of Java program provided that
196 classes to be visualised are available in the classpath.
200 JavaInspect currently has no GUI, configuration files, embedded
201 scripting support, direct Maven or Ant integration. The only way to
202 instuct Javainspect what to do is by using its Java API.
206 To get JavaInspect into same classpath with your projecs I so far came
211 <li>Add JavaInspect library in your project as a dependency.
213 <li>Create new Java project for the purpose visualizing your other
214 projects and include JavaInspect and your projecs binary artifacts
215 (Jar's) into new project classpath. Built binary Jar's (with no
216 source code) are sufficient because JavaInspect operates via
222 After discovering application structure and optionally filtering out
223 unimportant parts, JavaInspect produces GraphViz dot file that
224 describes data to be visualized. Then launches GraphViz to generate
225 bitmap graph in PNG format. By default on your Desktop directory.
229 Note: GraphViz is developed and tested so far only on GNU Linux.
234 <div id="outline-container-sec-2" class="outline-2">
235 <h2 id="sec-2"><span class="section-number-2">2</span> Example graphs</h2>
236 <div class="outline-text-2" id="text-2">
238 <li>A very simple example:
242 <p><a href="example.png"><img src="example.resized.png" alt="example.resized.png" /></a>
252 <p><img src="legend.png" alt="legend.png" />
257 <li>Example visualization of <a href="http://www2.svjatoslav.eu/gitbrowse/sixth/doc/">Sixth</a> project: <a href="http://www2.svjatoslav.eu/projects/sixth/codegraphs/">architecture graphs</a>.
263 <div id="outline-container-sec-3" class="outline-2">
264 <h2 id="sec-3"><span class="section-number-2">3</span> Usage</h2>
265 <div class="outline-text-2" id="text-3">
267 Currently the only way to control JavaInspect is by using Java
268 API. Simple Java based control/configuration code needs to be written
269 for each project. I usually put such code into directories devoted for
270 JUnit tests. Because it needs not to be compiled/embedded into final
271 product or project artifact I'm just willing to visualize.
275 Control code in general does the following:
278 <li>Create graph object.
280 <li>Java reflection/classloaders does not provide mechanism for
281 discovering all classes under given package. Therefore you need to
282 declare at least some classes to be added to the graph by:
284 <li>Manually adding individual classes to the graph.
286 <li>and/or: Let GraphViz recursively scan and parse specified
287 directories with Java source code files to discover class names.
289 <li>For every class added to the graph, GraphViz will recursively
290 inspect it and add all referecned classes to the graph as well.
294 <li>Graphs easilly get very big and complex so optionally we filter
295 important code using classname wildcards patterns based blacklist
298 <li>Optionally we can tune some rendering parameters like:
300 <li>Possibility to remove orphaned classes (classes with no
301 references) from the graph.
303 <li>Specify target directory for generated visualization
304 files. (Default is user desktop directory)
306 <li>Keep intermediate GraphViz dot file for later inspection.
316 <div id="outline-container-sec-3-1" class="outline-3">
317 <h3 id="sec-3-1"><span class="section-number-3">3.1</span> example 1</h3>
318 <div class="outline-text-3" id="text-3-1">
320 This example demonstrates generating of class graph from hand picked
324 <div class="org-src-container">
326 <pre class="src src-java"><span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Create graph</span>
327 <span style="color: #F92672;">final</span> <span style="color: #66D9EF;">ClassGraph</span> <span style="color: #FD971F;">graph</span> = <span style="color: #F92672;">new</span> <span style="color: #66D9EF;">ClassGraph</span>();
329 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">While classes and objects can be immediately passed to ClassGraph</span>
330 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">constructor as arguments, it is also possible to add them one by</span>
331 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">one as in the following example.</span>
333 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some object to the graph.</span>
334 graph.addObject(graph);
336 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some class to the graph.</span>
337 graph.addClass(Utils.<span style="color: #F92672;">class</span>);
339 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Produce bitmap image titled "JavaInspect.png" to the user Desktop</span>
340 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">directory and keep intermediary GraphViz DOT file for reference.</span>
341 graph.generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>, <span style="color: #FF80F4;">true</span>);
351 <li>Generated DOT file: <a href="JavaInspect.dot">JavaInspect.dot</a>
353 <li>Generated PNG image: <a href="JavaInspect.png">JavaInspect.png</a>
359 <div id="outline-container-sec-3-2" class="outline-3">
360 <h3 id="sec-3-2"><span class="section-number-3">3.2</span> example 2</h3>
361 <div class="outline-text-3" id="text-3-2">
363 Recursively scan current directory for Java source code and attempt to
364 detect class names from there to be added to the graph.
367 <div class="org-src-container">
369 <pre class="src src-java">graph.addProject(<span style="color: #EEDC82;">"."</span>);
371 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Blacklist example classes from being shown on the graph</span>
372 graph.getFilter().blacklistClassPattern(
373 <span style="color: #EEDC82;">"eu.svjatoslav.inspector.java.structure.example.*"</span>);
375 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">do not show single classes with no relationships on the graph</span>
376 graph.hideOrphanedClasses();
378 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Produce bitmap image titled "JavaInspect full project.png" to the</span>
379 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">user Desktop directory.</span>
380 graph.generateGraph(<span style="color: #EEDC82;">"JavaInspect full project"</span>);
387 <li>Generated PNG image: <a href="JavaInspect%20full%20project.png">JavaInspect full project.png</a>
394 <div id="outline-container-sec-4" class="outline-2">
395 <h2 id="sec-4"><span class="section-number-2">4</span> Embedding JavaInspect in your Maven project</h2>
396 <div class="outline-text-2" id="text-4">
398 Declare JavaInspect as dependency:
400 <div class="org-src-container">
402 <pre class="src src-xml"><<span style="color: #A6E22E;">dependencies</span>>
404 <<span style="color: #A6E22E;">dependency</span>>
405 <<span style="color: #A6E22E;">groupId</span>>eu.svjatoslav</<span style="color: #A6E22E;">groupId</span>>
406 <<span style="color: #A6E22E;">artifactId</span>>javainspect</<span style="color: #A6E22E;">artifactId</span>>
407 <<span style="color: #A6E22E;">version</span>>1.3</<span style="color: #A6E22E;">version</span>>
408 </<span style="color: #A6E22E;">dependency</span>>
410 </<span style="color: #A6E22E;">dependencies</span>>
416 Add Maven repository to retrieve artifact from:
418 <div class="org-src-container">
420 <pre class="src src-xml"><<span style="color: #A6E22E;">repositories</span>>
422 <<span style="color: #A6E22E;">repository</span>>
423 <<span style="color: #A6E22E;">id</span>>svjatoslav.eu</<span style="color: #A6E22E;">id</span>>
424 <<span style="color: #A6E22E;">name</span>>Svjatoslav repository</<span style="color: #A6E22E;">name</span>>
425 <<span style="color: #A6E22E;">url</span>>http://www2.svjatoslav.eu/maven/</<span style="color: #A6E22E;">url</span>>
426 </<span style="color: #A6E22E;">repository</span>>
428 </<span style="color: #A6E22E;">repositories</span>>
434 <div id="outline-container-sec-5" class="outline-2">
435 <h2 id="sec-5"><span class="section-number-2">5</span> Requirements</h2>
436 <div class="outline-text-2" id="text-5">
438 <a href="http://www.graphviz.org/">GraphViz</a> - shall be installed on the computer.
442 On Ubuntu/Debian use:
444 <pre class="example">
445 sudo apt-get install graphviz
449 <div id="outline-container-sec-6" class="outline-2">
450 <h2 id="sec-6"><span class="section-number-2">6</span> <span class="todo TODO">TODO</span> </h2>
451 <div class="outline-text-2" id="text-6">
453 <li>BUG: Should not hide references if there are too many of them to
454 classes if referring classes are not visible anyway because of
455 blacklist/whitelist rules. Basically reference counting should
456 exclude not visible classes.
458 <li>BUG: Current code is quite messy (because of lack of time) things
459 were implemented ad-hoc. Needs cleanup/refactoring for better
462 <li>FEATURE: add dark theme
464 <li>FEATURE: sort Class fields by alphabet
466 <li>FEATURE: visualize also concrete field values so it could be used as
467 ultra cool runtime logging framework
469 <li>FEATURE: possibility to visualize structure and data from JVM
472 <li>FEATURE: possibility to attach to remote process to visualize
473 data/structure using JVM debug port and mechanism.
475 <li>FEATURE: possibility to attach to JVM using JVM agent
477 <li>FEATURE: possibility to script javainspect behavior
479 <li>FEATURE: possibility to select classes/fields/values to be
480 visualized in SQL like syntax
482 <li>FEATURE: configurable maven plugin to generate graphs as part of the
483 project build/release process
489 <div id="postamble" class="status">
490 <p class="author">Author: Svjatoslav Agejenko</p>
491 <p class="date">Created: 2015-03-03 Tue 22:24</p>
492 <p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 24.4.1 (<a href="http://orgmode.org">Org</a> mode 8.2.10)</p>
493 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>