-<!doctype html>
-<html lang="en">
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
+<!-- 2022-02-20 Sun 20:27 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>JavaInspect - Utility to visualize java software</title>
-<!-- 2021-01-10 P 00:37 -->
-<meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<meta name="generator" content="Org-mode">
-<meta name="author" content="Svjatoslav Agejenko">
+<meta name="generator" content="Org mode" />
+<meta name="author" content="Svjatoslav Agejenko" />
+<style type="text/css">
+ <!--/*--><![CDATA[/*><!--*/
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #ccc;
+ box-shadow: 3px 3px 3px #eee;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ padding-top: 1.2em;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ background-color: white;
+ top: -10px;
+ right: 10px;
+ padding: 3px;
+ border: 1px solid black;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { width: 90%; }
+ /*]]>*/-->
+</style>
<link href="https://bootswatch.com/3/darkly/bootstrap.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js"></script>
footer {background-color: #111 !important;}
pre {background-color: #111; color: #ccc;}
</style>
-<style type="text/css">
-/* org mode styles on top of twbs */
-
-html {
- position: relative;
- min-height: 100%;
-}
-
-body {
- font-size: 18px;
- margin-bottom: 105px;
-}
-
-footer {
- position: absolute;
- bottom: 0;
- width: 100%;
- height: 101px;
- background-color: #f5f5f5;
-}
-
-footer > div {
- padding: 10px;
-}
-
-footer p {
- margin: 0 0 5px;
- text-align: center;
- font-size: 16px;
-}
-
-#table-of-contents {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-blockquote p {
- font-size: 18px;
-}
-
-pre {
- font-size: 16px;
-}
-
-.footpara {
- display: inline-block;
-}
-
-figcaption {
- font-size: 16px;
- color: #666;
- font-style: italic;
- padding-bottom: 15px;
-}
-
-/* from twbs docs */
-
-.bs-docs-sidebar.affix {
- position: static;
-}
-@media (min-width: 768px) {
- .bs-docs-sidebar {
- padding-left: 20px;
- }
-}
-
-/* All levels of nav */
-.bs-docs-sidebar .nav > li > a {
- display: block;
- padding: 4px 20px;
- font-size: 14px;
- font-weight: 500;
- color: #999;
-}
-.bs-docs-sidebar .nav > li > a:hover,
-.bs-docs-sidebar .nav > li > a:focus {
- padding-left: 19px;
- color: #A1283B;
- text-decoration: none;
- background-color: transparent;
- border-left: 1px solid #A1283B;
-}
-.bs-docs-sidebar .nav > .active > a,
-.bs-docs-sidebar .nav > .active:hover > a,
-.bs-docs-sidebar .nav > .active:focus > a {
- padding-left: 18px;
- font-weight: bold;
- color: #A1283B;
- background-color: transparent;
- border-left: 2px solid #A1283B;
-}
-
-/* Nav: second level (shown on .active) */
-.bs-docs-sidebar .nav .nav {
- display: none; /* Hide by default, but at >768px, show it */
- padding-bottom: 10px;
-}
-.bs-docs-sidebar .nav .nav > li > a {
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 30px;
- font-size: 12px;
- font-weight: normal;
-}
-.bs-docs-sidebar .nav .nav > li > a:hover,
-.bs-docs-sidebar .nav .nav > li > a:focus {
- padding-left: 29px;
-}
-.bs-docs-sidebar .nav .nav > .active > a,
-.bs-docs-sidebar .nav .nav > .active:hover > a,
-.bs-docs-sidebar .nav .nav > .active:focus > a {
- padding-left: 28px;
- font-weight: 500;
-}
-
-/* Nav: third level (shown on .active) */
-.bs-docs-sidebar .nav .nav .nav {
- padding-bottom: 10px;
-}
-.bs-docs-sidebar .nav .nav .nav > li > a {
- padding-top: 1px;
- padding-bottom: 1px;
- padding-left: 40px;
- font-size: 12px;
- font-weight: normal;
-}
-.bs-docs-sidebar .nav .nav .nav > li > a:hover,
-.bs-docs-sidebar .nav .nav .nav > li > a:focus {
- padding-left: 39px;
-}
-.bs-docs-sidebar .nav .nav .nav > .active > a,
-.bs-docs-sidebar .nav .nav .nav > .active:hover > a,
-.bs-docs-sidebar .nav .nav .nav > .active:focus > a {
- padding-left: 38px;
- font-weight: 500;
-}
-
-/* Show and affix the side nav when space allows it */
-@media (min-width: 992px) {
- .bs-docs-sidebar .nav > .active > ul {
- display: block;
- }
- /* Widen the fixed sidebar */
- .bs-docs-sidebar.affix,
- .bs-docs-sidebar.affix-bottom {
- width: 213px;
- }
- .bs-docs-sidebar.affix {
- position: fixed; /* Undo the static from mobile first approach */
- top: 20px;
- }
- .bs-docs-sidebar.affix-bottom {
- position: absolute; /* Undo the static from mobile first approach */
- }
- .bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav {
- margin-top: 0;
- margin-bottom: 0
- }
-}
-@media (min-width: 1200px) {
- /* Widen the fixed sidebar again */
- .bs-docs-sidebar.affix-bottom,
- .bs-docs-sidebar.affix {
- width: 263px;
- }
-}
-</style>
+<link rel="stylesheet" type="text/css" href="https://thomasf.github.io/solarized-css/solarized-dark.min.css" />
<script type="text/javascript">
-$(function() {
- 'use strict';
-
- $('.bs-docs-sidebar li').first().addClass('active');
-
- $(document.body).scrollspy({target: '.bs-docs-sidebar'});
-
- $('.bs-docs-sidebar').affix();
-});
+// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
+<!--/*--><![CDATA[/*><!--*/
+ function CodeHighlightOn(elem, id)
+ {
+ var target = document.getElementById(id);
+ if(null != target) {
+ elem.classList.add("code-highlighted");
+ target.classList.add("code-highlighted");
+ }
+ }
+ function CodeHighlightOff(elem, id)
+ {
+ var target = document.getElementById(id);
+ if(null != target) {
+ elem.classList.remove("code-highlighted");
+ target.classList.remove("code-highlighted");
+ }
+ }
+ /*]]>*///-->
+// @license-end
</script>
</head>
<body>
-<div id="content" class="container">
-<div class="row"><div class="col-md-9"><h1 class="title">JavaInspect - Utility to visualize java software</h1>
+<div id="content">
+<h1 class="title">JavaInspect - Utility to visualize java software</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents">
+<ul>
+<li><a href="#orga6751f6">1. General</a>
+<ul>
+<li><a href="#org926416f">1.1. Source code</a></li>
+</ul>
+</li>
+<li><a href="#org65fe059">2. Goal and operating principle</a></li>
+<li><a href="#org7fe659d">3. Example graphs</a></li>
+<li><a href="#org163c1cb">4. Installation</a></li>
+<li><a href="#orgaa497bf">5. Usage</a>
+<ul>
+<li><a href="#org68d4e58">5.1. Usage as commandline utility</a>
+<ul>
+<li><a href="#org4c2e5f8">5.1.1. Available commandline arguments</a></li>
+<li><a href="#orgceb0cbf">5.1.2. Specifying classes to render</a></li>
+</ul>
+</li>
+<li><a href="#org8037e80">5.2. Usage via Java API</a>
+<ul>
+<li><a href="#org56db96c">5.2.1. Example 1: individually picked objects</a></li>
+<li><a href="#org419624a">5.2.2. Example 2: GraphViz embedded in another project</a></li>
+<li><a href="#orgdf4f0b1">5.2.3. Embedding JavaInspect in your Maven project</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#org556c7e2">6. TO DO</a></li>
+<li><a href="#orgf7baf29">7. See also</a></li>
+</ul>
+</div>
+</div>
-<div id="outline-container-sec-1" class="outline-2">
-<h2 id="sec-1"><span class="section-number-2">1</span> General</h2>
+<div id="outline-container-orga6751f6" class="outline-2">
+<h2 id="orga6751f6"><span class="section-number-2">1</span> General</h2>
<div class="outline-text-2" id="text-1">
<ul class="org-ul">
<li>This program is free software: you can redistribute it and/or modify
it under the terms of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a> as
published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-</li>
+License, or (at your option) any later version.</li>
<li>Program authors:
<ul class="org-ul">
<li>Svjatoslav Agejenko
<ul class="org-ul">
-<li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a>
-</li>
-<li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
-</li>
-<li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a>
-</li>
-</ul>
-</li>
+<li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a></li>
+<li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a></li>
+<li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a></li>
+</ul></li>
<li>Tony Bargnesi
<ul class="org-ul">
<li>GitHub fork for the project:
-<a href="https://github.com/abargnesi/javainspect">https://github.com/abargnesi/javainspect</a>
-</li>
-</ul>
-</li>
-</ul>
-</li>
+<a href="https://github.com/abargnesi/javainspect">https://github.com/abargnesi/javainspect</a></li>
+</ul></li>
+</ul></li>
</ul>
</div>
-<div id="outline-container-sec-1-1" class="outline-3">
-<h3 id="sec-1-1"><span class="section-number-3">1.1</span> Source code</h3>
+<div id="outline-container-org926416f" class="outline-3">
+<h3 id="org926416f"><span class="section-number-3">1.1</span> Source code</h3>
<div class="outline-text-3" id="text-1-1">
<ul class="org-ul">
-<li><a href="https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz">Download latest snapshot in TAR GZ format</a>
-</li>
+<li><a href="https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz">Download latest snapshot in TAR GZ format</a></li>
-<li><a href="https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary">Browse Git repository online</a>
-</li>
+<li><a href="https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary">Browse Git repository online</a></li>
-<li>Clone Git repository using command:
+<li><p>
+Clone Git repository using command:
+</p>
<pre class="example">
git clone https://www2.svjatoslav.eu/git/javainspect.git
-
-</pre>
-</li>
+</pre></li>
</ul>
</div>
</div>
</div>
-<div id="outline-container-sec-2" class="outline-2">
-<h2 id="sec-2"><span class="section-number-2">2</span> Goal and operating principle</h2>
+<div id="outline-container-org65fe059" class="outline-2">
+<h2 id="org65fe059"><span class="section-number-2">2</span> Goal and operating principle</h2>
<div class="outline-text-2" id="text-2">
<p>
Goal: simplify/speed up understanding the computer program code by
</p>
<p>
-JavaInspect can be used as a <a href="#sec-4-1">standalone commandline utility</a> as well as
-<a href="#sec-4-2">java library</a>. JavaInspect uses primarily Java built-in reflection to
+JavaInspect can be used as a <a href="#org68d4e58">standalone commandline utility</a> as well as
+<a href="#org8037e80">java library</a>. JavaInspect uses primarily Java built-in reflection to
discover and visualize any part of Java program.
</p>
<p>
-JavaInspect currently has no GUI, configuration files, embedded
-scripting support, direct Maven or Ant integration. See <a href="#sec-4">usage</a> to learn
-how to instuct Javainspect what to do.
+JavaInspect currently has no graphical user interface, configuration
+files, embedded scripting support, direct Maven, Gradle or Ant
+integration. See <a href="#orgaa497bf">usage</a> to learn how to instuct Javainspect what to do.
</p>
<p>
Notes:
</p>
<ul class="org-ul">
-<li>JavaInspect is developed and tested so far only on GNU/Linux.
-</li>
-<li>See: <a href="https://github.com/pahen/madge">Madge - similar tool for JavaScript</a>
-</li>
+<li>JavaInspect is developed and tested so far only on GNU/Linux.</li>
</ul>
</div>
</div>
-<div id="outline-container-sec-3" class="outline-2">
-<h2 id="sec-3"><span class="section-number-2">3</span> Example graphs</h2>
+<div id="outline-container-org7fe659d" class="outline-2">
+<h2 id="org7fe659d"><span class="section-number-2">3</span> Example graphs</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
-<li>A very simple example:
+<li><p>
+A very simple example:
+</p>
-<figure>
-<p><img src="example.png" class="img-responsive" alt="example.png">
+<div id="org5c02965" class="figure">
+<p><a href="example.png"><img src="example-thumbnail.png" alt="example-thumbnail.png" /></a>
</p>
-</figure>
+</div>
<p>
Graph legend:
</p>
-<figure>
-<p><img src="legend.png" class="img-responsive" alt="legend.png">
+<div id="org32c854a" class="figure">
+<p><img src="legend.png" alt="legend.png" />
</p>
-</figure>
-</li>
+</div></li>
</ul>
<ul class="org-ul">
-<li><a href="https://www3.svjatoslav.eu/projects/sixth-3d/graphs/">See example produced graphs</a> for <a href="https://www3.svjatoslav.eu/projects/sixth-3d/">Sixth 3D - 3D engine project</a>.
-</li>
+<li><a href="https://www3.svjatoslav.eu/projects/sixth-3d/graphs/">See example produced graphs</a> for <a href="https://www3.svjatoslav.eu/projects/sixth-3d/">Sixth 3D - 3D engine project</a>.</li>
</ul>
</div>
</div>
-<div id="outline-container-sec-4" class="outline-2">
-<h2 id="sec-4"><a id="ID-2ad2889e-6c95-4662-b3f4-2c341fc74522" name="ID-2ad2889e-6c95-4662-b3f4-2c341fc74522"></a><span class="section-number-2">4</span> Usage</h2>
+<div id="outline-container-org163c1cb" class="outline-2">
+<h2 id="org163c1cb"><span class="section-number-2">4</span> Installation</h2>
<div class="outline-text-2" id="text-4">
<p>
-JavaInspect can be controlled in 2 different ways:
+<a href="http://www.graphviz.org/">GraphViz</a> - shall be installed on the computer.
</p>
-<ul class="org-ul">
-<li><a href="#sec-4-1">as standalone commandline utility</a>
-</li>
-<li><a href="#sec-4-2">as embedded Java library via Java API</a>
-</li>
-</ul>
+
+<p>
+On Ubuntu/Debian GraphViz can be installed using:
+</p>
+<div class="org-src-container">
+<pre class="src src-sh">sudo apt-get install graphviz
+</pre>
</div>
-<div id="outline-container-sec-4-1" class="outline-3">
-<h3 id="sec-4-1"><a id="ID-acf1896a-74b4-4914-acf6-a77075e07f25" name="ID-acf1896a-74b4-4914-acf6-a77075e07f25"></a><span class="section-number-3">4.1</span> usage as commandline utility</h3>
-<div class="outline-text-3" id="text-4-1">
<p>
-To enable commandline support, (study and) execute script:
+To use JavaInspect via Java API, no further installation is
+needed. JavaInspect will be embedded into your project as dependency.
+This is described in <a href="#org8037e80">usage via Java API</a>. It will expect GraphViz to be
+available in the system.
+</p>
+
+<p>
+To use JavaInspect as a commandline tool, JavaInspect source
+repository has to be cloned locally: See <a href="#org926416f">Source code</a>.
+</p>
+
+<p>
+Then study and execute installation script:
</p>
<pre class="example">
commandline launcher/install
+</pre>
+
+<p>
+After installation, new commandline tool should be available
+</p>
+<pre class="example">
+javainspect
</pre>
+
<p>
-Warning: It was tested only on Debian Stretch linux.
+Quick commandline usage help can be viewed by issuing
</p>
+<pre class="example">
+javainspect --help
+</pre>
+</div>
+</div>
+<div id="outline-container-orgaa497bf" class="outline-2">
+<h2 id="orgaa497bf"><span class="section-number-2">5</span> Usage</h2>
+<div class="outline-text-2" id="text-5">
<p>
-Available commandline arguments:
+JavaInspect can be controlled in 2 different ways:
</p>
+<ul class="org-ul">
+<li><a href="#org68d4e58">as standalone commandline utility</a></li>
+<li><a href="#org8037e80">as embedded Java library via Java API</a></li>
+</ul>
+</div>
+
+<div id="outline-container-org68d4e58" class="outline-3">
+<h3 id="org68d4e58"><span class="section-number-3">5.1</span> Usage as commandline utility</h3>
+<div class="outline-text-3" id="text-5-1">
+</div>
+<div id="outline-container-org4c2e5f8" class="outline-4">
+<h4 id="org4c2e5f8"><span class="section-number-4">5.1.1</span> Available commandline arguments</h4>
+<div class="outline-text-4" id="text-5-1-1">
<p class="verse">
--j (existing files)…<br >
-    JAR file(s) to render.<br >
-<br >
--n (mandatory, string)<br >
-    Graph name.<br >
-<br >
-–debug<br >
-    Show debug info.<br >
-<br >
--k<br >
-    Keep dot file.<br >
-<br >
--h<br >
-    Hide orphaned classes.<br >
-<br >
--w (one to many strings)…<br >
-    Whitelist glob(s).<br >
-<br >
--b (one to many strings)…<br >
-    Blacklist glob(s).<br >
-<br >
--d (existingdirectory)<br >
-    Target directory. Default is current directory.<br >
-<br >
--t (options: png, svg)<br >
-    Target image type. Default is: svg.<br >
-</p>
-</div>
-</div>
-<div id="outline-container-sec-4-2" class="outline-3">
-<h3 id="sec-4-2"><a id="ID-bbeeffc8-3767-440d-8d93-ec9124dd60ee" name="ID-bbeeffc8-3767-440d-8d93-ec9124dd60ee"></a><span class="section-number-3">4.2</span> usage via Java API</h3>
-<div class="outline-text-3" id="text-4-2">
+-j (existing files)…<br />
+    JAR file(s) to render.<br />
+<br />
+-c (existing directories)…<br />
+    Classpath directories<br />
+<br />
+-n (string)<br />
+    Graph name. (default: "graph")<br />
+<br />
+–debug<br />
+    Show debug info.<br />
+<br />
+-h, –help<br />
+    Show commandline usage help.<br />
+<br />
+-k<br />
+    Keep dot file.<br />
+<br />
+-ho<br />
+    Hide orphaned classes.<br />
+<br />
+-w (one to many strings)…<br />
+    Whitelist glob(s).<br />
+<br />
+-b (one to many strings)…<br />
+    Blacklist glob(s).<br />
+<br />
+-r (one to many strings)…<br />
+    root class(es).<br />
+<br />
+-d (existing directory)<br />
+    Target directory. Default is current directory.<br />
+<br />
+-t (options: png, svg)<br />
+    Target image type. Default is: svg.<br />
+</p>
+</div>
+</div>
+<div id="outline-container-orgceb0cbf" class="outline-4">
+<h4 id="orgceb0cbf"><span class="section-number-4">5.1.2</span> Specifying classes to render</h4>
+<div class="outline-text-4" id="text-5-1-2">
+<p>
+Normal Java application has immense complexity. In addition to code
+that was directly written by particular project developers, lots of
+functionality is typically added as frameworks or libraries to the
+project. In addition there is significant Java standard library.
+</p>
+
+<p>
+Because JavaInspect uses reflection, it does not easily distinguish
+between those. In normal situation you would rather want to visualize
+only code that was developed specifically for your project and leave
+frameworks like Spring etc. out. If you visualize all classes that are
+possibly reachable from you project, you will easily get huge and
+incomprehensible graph.
+</p>
+
+<p>
+JavaInspect can digest compiled Java classes in 2 modes:
+</p>
+<ol class="org-ol">
+<li>Provide list of Jar files. Use <b>-j</b> option.</li>
+<li>Provide list of filesystem directories that can be used as
+classpath root. Use <b>-c</b> option.</li>
+</ol>
+
+<p>
+Currently JavaInspect uses following algorithm to add classes to
+rendered graph:
+</p>
+
+<ul class="org-ul">
+<li>All classes that were found in Jar files are added to graph by default.</li>
+<li>None of the classes that were found in filesystem directories are
+added to the graph by default (unless explicitly referenced). (TODO:
+for consistency it would be better to add them too by default)</li>
+<li>If whitelist is specified (<b>-w</b> option) everything that is not
+matched by whitelist pattern(s) will be removed from the graph.</li>
+<li>If blacklist is specified (<b>-b</b> option) everything that is matched
+by blacklist pattern(s) will be removed from the graph.</li>
+<li>Root classes can be specified using <b>-r</b> option. Root classes will
+be added to the graph. JavaInspect will then try to recursively
+discover all classes that were referenced by root class and add
+those also to the graph.</li>
+</ul>
+</div>
+</div>
+</div>
+
+<div id="outline-container-org8037e80" class="outline-3">
+<h3 id="org8037e80"><span class="section-number-3">5.2</span> Usage via Java API</h3>
+<div class="outline-text-3" id="text-5-2">
<p>
Requires that classes to be visualised are available in the classpath.
</p>
</p>
<ol class="org-ol">
-<li>Add JavaInspect library in your project as a dependency.
-</li>
+<li>Add JavaInspect library in your project as a dependency.</li>
<li>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.
-</li>
+reflection.</li>
</ol>
<p>
Control code in general does the following:
</p>
<ol class="org-ol">
-<li>Create graph object.
-</li>
+<li>Create graph object.</li>
<li>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. For every class added to
the graph, GraphViz will recursively inspect it and add all
-referecned classes to the graph as well.
-</li>
+referecned classes to the graph as well.</li>
<li>Graphs easilly get very big and complex so optionally we filter
important code using classname <a href="https://en.wikipedia.org/wiki/Glob_(programming)">glob</a> patterns based blacklist and/or
-whitelist.
-</li>
+whitelist.</li>
<li>Optionally we can tune some rendering parameters like:
<ul class="org-ul">
<li>Possibility to remove orphaned classes (classes with no
-references) from the graph.
-</li>
+references) from the graph.</li>
<li>Specify target directory for generated visualization
-files. (Default is current directory)
-</li>
-<li>Keep intermediate GraphViz dot file for later inspection.
-</li>
-</ul>
-</li>
-<li>Render graph.
-</li>
+files. (Default is current directory)</li>
+<li>Keep intermediate GraphViz dot file for later inspection.</li>
+</ul></li>
+<li>Render graph.</li>
</ol>
</div>
-<div id="outline-container-sec-4-2-1" class="outline-4">
-<h4 id="sec-4-2-1"><span class="section-number-4">4.2.1</span> example 1: individually picked objects</h4>
-<div class="outline-text-4" id="text-4-2-1">
+<div id="outline-container-org56db96c" class="outline-4">
+<h4 id="org56db96c"><span class="section-number-4">5.2.1</span> Example 1: individually picked objects</h4>
+<div class="outline-text-4" id="text-5-2-1">
<p>
This example demonstrates generating of class graph from hand picked
classes and visualizing GraphViz itself.
</p>
<div class="org-src-container">
-
-<pre class="src src-java"><span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Create graph</span>
+<pre class="src src-java">
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Create graph</span>
<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>();
<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some random object to the graph. GraphViz will detect Class from</span>
Note: if desired, more compact version of the above:
</p>
<div class="org-src-container">
-
<pre class="src src-java"><span style="color: #F92672;">new</span> <span style="color: #66D9EF;">ClassGraph</span>().add(randomObject, RandomClass.<span style="color: #F92672;">class</span>)
.setKeepDotFile(<span style="color: #FF80F4;">true</span>).generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>);
</pre>
Result:
</p>
<ul class="org-ul">
-<li>Generated DOT file: <a href="JavaInspect.dot">JavaInspect.dot</a>
-</li>
-<li>Generated PNG image: <a href="JavaInspect.png">JavaInspect.png</a>
-</li>
+<li>Generated DOT file: <a href="JavaInspect.dot">JavaInspect.dot</a></li>
+<li>Generated PNG image: <a href="JavaInspect.png">JavaInspect.png</a></li>
</ul>
</div>
</div>
-<div id="outline-container-sec-4-2-2" class="outline-4">
-<h4 id="sec-4-2-2"><span class="section-number-4">4.2.2</span> example 2: GraphViz embedded in another project</h4>
-<div class="outline-text-4" id="text-4-2-2">
+<div id="outline-container-org419624a" class="outline-4">
+<h4 id="org419624a"><span class="section-number-4">5.2.2</span> Example 2: GraphViz embedded in another project</h4>
+<div class="outline-text-4" id="text-5-2-2">
<ol class="org-ol">
-<li>Download project Sixth <a href="https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz">code snapshot</a>.
-</li>
-<li>Inspect and run <b>DataGraph.java</b>.
-</li>
+<li>Download project Sixth <a href="https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz">code snapshot</a>.</li>
+<li>Inspect and run <b>DataGraph.java</b>.</li>
</ol>
</div>
</div>
-<div id="outline-container-sec-4-2-3" class="outline-4">
-<h4 id="sec-4-2-3"><span class="section-number-4">4.2.3</span> Embedding JavaInspect in your Maven project</h4>
-<div class="outline-text-4" id="text-4-2-3">
+<div id="outline-container-orgdf4f0b1" class="outline-4">
+<h4 id="orgdf4f0b1"><span class="section-number-4">5.2.3</span> Embedding JavaInspect in your Maven project</h4>
+<div class="outline-text-4" id="text-5-2-3">
<p>
Declare JavaInspect as dependency:
</p>
<div class="org-src-container">
-
<pre class="src src-xml"><<span style="color: #A6E22E;">dependencies</span>>
...
<<span style="color: #A6E22E;">dependency</span>>
Add Maven repository to retrieve artifact from:
</p>
<div class="org-src-container">
-
<pre class="src src-xml"><<span style="color: #A6E22E;">repositories</span>>
...
<<span style="color: #A6E22E;">repository</span>>
</div>
</div>
-<div id="outline-container-sec-5" class="outline-2">
-<h2 id="sec-5"><span class="section-number-2">5</span> Requirements</h2>
-<div class="outline-text-2" id="text-5">
-<p>
-<a href="http://www.graphviz.org/">GraphViz</a> - shall be installed on the computer.
-</p>
-
-<p>
-On Ubuntu/Debian use:
-</p>
-<div class="org-src-container">
-
-<pre class="src src-sh">sudo apt-get install graphviz
-</pre>
-</div>
-</div>
-</div>
-<div id="outline-container-sec-6" class="outline-2">
-<h2 id="sec-6"><span class="section-number-2">6</span> TO DO</h2>
+<div id="outline-container-org556c7e2" class="outline-2">
+<h2 id="org556c7e2"><span class="section-number-2">6</span> TO DO</h2>
<div class="outline-text-2" id="text-6">
<p>
Note: Because this is side project (and I have many of them) I can
<li>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.
-</li>
+exclude not visible classes.</li>
<li>BUG: Orphaned class removal does not work always. There are many
-bugs and corner cases to find and fix still.
-</li>
+bugs and corner cases to find and fix still.</li>
<li>BUG: Code is not very readable. Document and refactor for better
-maintainability.
-</li>
+maintainability.</li>
<li>FEATURE: Create installable DEB package.
<ul class="org-ul">
<li>Submit it to some Debian developer for integration or become
-Debian package maintainer.
-</li>
-</ul>
-</li>
+Debian package maintainer.</li>
+</ul></li>
<li>FEATURE: Make it modular. That is: central part, an application
model could be standalone and serializable.
<li>There could be multiple ways to acquire model:
<ul class="org-ul">
<li>By introspecting application via Java reflections (current mode
-of operation).
-</li>
-<li>By parsing java source. (unfinished)
-</li>
-</ul>
-</li>
+of operation).</li>
+<li>By parsing java source. (unfinished)</li>
+</ul></li>
<li>There could be ways to manipulate model:
<ul class="org-ul">
-<li>Store/load/compare.
-</li>
-<li>Trim uninteresting parts.
-</li>
-<li>Highlight important parts.
-</li>
-</ul>
-</li>
+<li>Store/load/compare.</li>
+<li>Trim uninteresting parts.</li>
+<li>Highlight important parts.</li>
+</ul></li>
<li>There could be multiple ways to render model:
<ul class="org-ul">
-<li>PNG/SVG (currently implemented)
-</li>
-<li>PlantUML (TODO)
-</li>
-<li>Interactive 3D visualization (TODO)
-</li>
-</ul>
-</li>
-</ul>
-</li>
+<li>PNG/SVG (currently implemented)</li>
+<li>PlantUML (TODO)</li>
+<li>Interactive 3D visualization (TODO)</li>
+</ul></li>
+</ul></li>
<li>FEATURE: Implement (or integrate existing java parser
<a href="https://javaparser.org/">https://javaparser.org/</a>) to be able to produce code visualizations
based on source code (in addition to current reflection based
-approach).
-</li>
+approach).</li>
-<li>FEATURE: Integarte with <a href="http://plantuml.com/class-diagram">PlantUML</a>.
-</li>
+<li>FEATURE: Integarte with <a href="http://plantuml.com/class-diagram">PlantUML</a>.</li>
-<li>FEATURE: Add dark theme for generated graphs.
-</li>
+<li>FEATURE: Add dark theme for generated graphs.</li>
-<li>FEATURE: Sort Class fields by alphabet.
-</li>
+<li>FEATURE: Sort Class fields by alphabet.</li>
<li>FEATURE: Visualize also concrete field values so it could be used as
-ultra cool runtime logging/debugging framework.
-</li>
+ultra cool runtime logging/debugging framework.</li>
<li>FEATURE: Possibility to visualize structure and data from JVM
-snapshot.
-</li>
+snapshot.</li>
<li>FEATURE: Possibility to attach to remote process to visualize
-data/structure using JVM debug port and mechanism.
-</li>
+data/structure using JVM debug port and mechanism.</li>
-<li>FEATURE: Possibility to attach to JVM using JVM agent.
-</li>
+<li>FEATURE: Possibility to attach to JVM using JVM agent.</li>
-<li>FEATURE: Possibility to inspect graphs in 3D using <a href="https://www3.svjatoslav.eu/projects/sixth-3d/">Sixth 3D engine</a>.
-</li>
+<li>FEATURE: Possibility to inspect graphs in 3D using <a href="https://www3.svjatoslav.eu/projects/sixth-3d/">Sixth 3D engine</a>.</li>
<li>FEATURE: Possibility to select classes/fields/values to be
visualized in some graph query language. For greater flexibility in
-comparison to currently supported glob syntax.
-</li>
+comparison to currently supported glob syntax.</li>
<li>FEATURE: Add option to control JavaInspect via JSON or XML config
file. For example different graphs for given project could be
defined once in plain text config, possibly with the aid of some
interactive utility. Then defined graphs could be updated as part of
-project build or release process.
-</li>
+project build or release process.</li>
<li>FEATURE: Configurable maven plugin to generate graphs as part of the
-project build/release process.
-</li>
+project build/release process.</li>
</ul>
</div>
</div>
-<div id="outline-container-sec-7" class="outline-2">
-<h2 id="sec-7"><span class="section-number-2">7</span> See also</h2>
+<div id="outline-container-orgf7baf29" class="outline-2">
+<h2 id="orgf7baf29"><span class="section-number-2">7</span> See also</h2>
<div class="outline-text-2" id="text-7">
<p>
Similar or alternative solutions:
</p>
<ul class="org-ul">
-<li><a href="http://www.class-visualizer.net/">http://www.class-visualizer.net/</a>
-</li>
+<li><a href="http://www.class-visualizer.net/">http://www.class-visualizer.net/</a></li>
+<li><a href="https://github.com/pahen/madge">Madge - similar tool for JavaScript</a></li>
</ul>
</div>
</div>
-</div><div class="col-md-3"><nav id="table-of-contents">
-<div id="text-table-of-contents" class="bs-docs-sidebar">
-<ul class="nav">
-<li><a href="#sec-1">1. General</a>
-<ul class="nav">
-<li><a href="#sec-1-1">1.1. Source code</a></li>
-</ul>
-</li>
-<li><a href="#sec-2">2. Goal and operating principle</a></li>
-<li><a href="#sec-3">3. Example graphs</a></li>
-<li><a href="#sec-4">4. Usage</a>
-<ul class="nav">
-<li><a href="#sec-4-1">4.1. usage as commandline utility</a></li>
-<li><a href="#sec-4-2">4.2. usage via Java API</a></li>
-</ul>
-</li>
-<li><a href="#sec-5">5. Requirements</a></li>
-<li><a href="#sec-6">6. TO DO</a></li>
-<li><a href="#sec-7">7. See also</a></li>
-</ul>
</div>
-</nav>
-</div></div></div>
-<footer id="postamble" class="">
-<div><p class="author">Author: Svjatoslav Agejenko</p>
-<p class="date">Created: 2021-01-10 P 00:37</p>
-<p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 26.1 (<a href="http://orgmode.org">Org-mode</a> 9.1.9)</p>
+<div id="postamble" class="status">
+<p class="author">Author: Svjatoslav Agejenko</p>
+<p class="date">Created: 2022-02-20 Sun 20:27</p>
+<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
-</footer>
</body>
</html>