updated project documentation
[javainspect.git] / doc / index.html
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <title>JavaInspect - Utility to visualize java software</title>
5 <!-- 2021-01-10 P 00:37 -->
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="generator" content="Org-mode">
9 <meta name="author" content="Svjatoslav Agejenko">
10 <link href="https://bootswatch.com/3/darkly/bootstrap.min.css" rel="stylesheet">
11 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
12 <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js"></script>
13 <style type="text/css">
14 footer {background-color: #111 !important;}
15 pre {background-color: #111; color: #ccc;}
16 </style>
17 <style type="text/css">
18 /* org mode styles on top of twbs */
19
20 html {
21     position: relative;
22     min-height: 100%;
23 }
24
25 body {
26     font-size: 18px;
27     margin-bottom: 105px;
28 }
29
30 footer {
31     position: absolute;
32     bottom: 0;
33     width: 100%;
34     height: 101px;
35     background-color: #f5f5f5;
36 }
37
38 footer > div {
39     padding: 10px;
40 }
41
42 footer p {
43     margin: 0 0 5px;
44     text-align: center;
45     font-size: 16px;
46 }
47
48 #table-of-contents {
49     margin-top: 20px;
50     margin-bottom: 20px;
51 }
52
53 blockquote p {
54     font-size: 18px;
55 }
56
57 pre {
58     font-size: 16px;
59 }
60
61 .footpara {
62     display: inline-block;
63 }
64
65 figcaption {
66   font-size: 16px;
67   color: #666;
68   font-style: italic;
69   padding-bottom: 15px;
70 }
71
72 /* from twbs docs */
73
74 .bs-docs-sidebar.affix {
75     position: static;
76 }
77 @media (min-width: 768px) {
78     .bs-docs-sidebar {
79         padding-left: 20px;
80     }
81 }
82
83 /* All levels of nav */
84 .bs-docs-sidebar .nav > li > a {
85     display: block;
86     padding: 4px 20px;
87     font-size: 14px;
88     font-weight: 500;
89     color: #999;
90 }
91 .bs-docs-sidebar .nav > li > a:hover,
92 .bs-docs-sidebar .nav > li > a:focus {
93     padding-left: 19px;
94     color: #A1283B;
95     text-decoration: none;
96     background-color: transparent;
97     border-left: 1px solid #A1283B;
98 }
99 .bs-docs-sidebar .nav > .active > a,
100 .bs-docs-sidebar .nav > .active:hover > a,
101 .bs-docs-sidebar .nav > .active:focus > a {
102     padding-left: 18px;
103     font-weight: bold;
104     color: #A1283B;
105     background-color: transparent;
106     border-left: 2px solid #A1283B;
107 }
108
109 /* Nav: second level (shown on .active) */
110 .bs-docs-sidebar .nav .nav {
111     display: none; /* Hide by default, but at >768px, show it */
112     padding-bottom: 10px;
113 }
114 .bs-docs-sidebar .nav .nav > li > a {
115     padding-top: 1px;
116     padding-bottom: 1px;
117     padding-left: 30px;
118     font-size: 12px;
119     font-weight: normal;
120 }
121 .bs-docs-sidebar .nav .nav > li > a:hover,
122 .bs-docs-sidebar .nav .nav > li > a:focus {
123     padding-left: 29px;
124 }
125 .bs-docs-sidebar .nav .nav > .active > a,
126 .bs-docs-sidebar .nav .nav > .active:hover > a,
127 .bs-docs-sidebar .nav .nav > .active:focus > a {
128     padding-left: 28px;
129     font-weight: 500;
130 }
131
132 /* Nav: third level (shown on .active) */
133 .bs-docs-sidebar .nav .nav .nav {
134     padding-bottom: 10px;
135 }
136 .bs-docs-sidebar .nav .nav .nav > li > a {
137     padding-top: 1px;
138     padding-bottom: 1px;
139     padding-left: 40px;
140     font-size: 12px;
141     font-weight: normal;
142 }
143 .bs-docs-sidebar .nav .nav .nav > li > a:hover,
144 .bs-docs-sidebar .nav .nav .nav > li > a:focus {
145     padding-left: 39px;
146 }
147 .bs-docs-sidebar .nav .nav .nav > .active > a,
148 .bs-docs-sidebar .nav .nav .nav > .active:hover > a,
149 .bs-docs-sidebar .nav .nav .nav > .active:focus > a {
150     padding-left: 38px;
151     font-weight: 500;
152 }
153
154 /* Show and affix the side nav when space allows it */
155 @media (min-width: 992px) {
156     .bs-docs-sidebar .nav > .active > ul {
157         display: block;
158     }
159     /* Widen the fixed sidebar */
160     .bs-docs-sidebar.affix,
161     .bs-docs-sidebar.affix-bottom {
162         width: 213px;
163     }
164     .bs-docs-sidebar.affix {
165         position: fixed; /* Undo the static from mobile first approach */
166         top: 20px;
167     }
168     .bs-docs-sidebar.affix-bottom {
169         position: absolute; /* Undo the static from mobile first approach */
170     }
171     .bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav {
172         margin-top: 0;
173         margin-bottom: 0
174     }
175 }
176 @media (min-width: 1200px) {
177     /* Widen the fixed sidebar again */
178     .bs-docs-sidebar.affix-bottom,
179     .bs-docs-sidebar.affix {
180         width: 263px;
181     }
182 }
183 </style>
184 <script type="text/javascript">
185 $(function() {
186     'use strict';
187
188     $('.bs-docs-sidebar li').first().addClass('active');
189
190     $(document.body).scrollspy({target: '.bs-docs-sidebar'});
191
192     $('.bs-docs-sidebar').affix();
193 });
194 </script>
195 </head>
196 <body>
197 <div id="content" class="container">
198 <div class="row"><div class="col-md-9"><h1 class="title">JavaInspect - Utility to visualize java software</h1>
199
200 <div id="outline-container-sec-1" class="outline-2">
201 <h2 id="sec-1"><span class="section-number-2">1</span> General</h2>
202 <div class="outline-text-2" id="text-1">
203 <ul class="org-ul">
204 <li>This program is free software: you can redistribute it and/or modify
205 it under the terms of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a> as
206 published by the Free Software Foundation, either version 3 of the
207 License, or (at your option) any later version.
208 </li>
209
210 <li>Program authors:
211 <ul class="org-ul">
212 <li>Svjatoslav Agejenko
213 <ul class="org-ul">
214 <li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a>
215 </li>
216 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
217 </li>
218 <li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a>
219 </li>
220 </ul>
221 </li>
222
223 <li>Tony Bargnesi
224 <ul class="org-ul">
225 <li>GitHub fork for the project:
226 <a href="https://github.com/abargnesi/javainspect">https://github.com/abargnesi/javainspect</a>
227 </li>
228 </ul>
229 </li>
230 </ul>
231 </li>
232 </ul>
233 </div>
234
235 <div id="outline-container-sec-1-1" class="outline-3">
236 <h3 id="sec-1-1"><span class="section-number-3">1.1</span> Source code</h3>
237 <div class="outline-text-3" id="text-1-1">
238 <ul class="org-ul">
239 <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>
240 </li>
241
242 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary">Browse Git repository online</a>
243 </li>
244
245 <li>Clone Git repository using command:
246 <pre class="example">
247 git clone https://www2.svjatoslav.eu/git/javainspect.git
248
249 </pre>
250 </li>
251 </ul>
252 </div>
253 </div>
254 </div>
255
256 <div id="outline-container-sec-2" class="outline-2">
257 <h2 id="sec-2"><span class="section-number-2">2</span> Goal and operating principle</h2>
258 <div class="outline-text-2" id="text-2">
259 <p>
260 Goal: simplify/speed up understanding the computer program code by
261 automatically visualizing its structure.
262 </p>
263
264 <p>
265 <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>.
266 </p>
267
268 <p>
269 JavaInspect can be used as a <a href="#sec-4-1">standalone commandline utility</a> as well as
270 <a href="#sec-4-2">java library</a>. JavaInspect uses primarily Java built-in reflection to
271 discover and visualize any part of Java program.
272 </p>
273
274 <p>
275 JavaInspect currently has no GUI, configuration files, embedded
276 scripting support, direct Maven or Ant integration. See <a href="#sec-4">usage</a> to learn
277 how to instuct Javainspect what to do.
278 </p>
279
280 <p>
281 After discovering application structure and optionally filtering out
282 unimportant parts, JavaInspect produces GraphViz dot file that
283 describes data to be visualized. Then launches <a href="https://graphviz.org/">GraphViz</a> to generate
284 bitmap graph in PNG or SVG format.
285 </p>
286
287 <p>
288 Notes:
289 </p>
290 <ul class="org-ul">
291 <li>JavaInspect is developed and tested so far only on GNU/Linux.
292 </li>
293 <li>See: <a href="https://github.com/pahen/madge">Madge - similar tool for JavaScript</a>
294 </li>
295 </ul>
296 </div>
297 </div>
298
299 <div id="outline-container-sec-3" class="outline-2">
300 <h2 id="sec-3"><span class="section-number-2">3</span> Example graphs</h2>
301 <div class="outline-text-2" id="text-3">
302 <ul class="org-ul">
303 <li>A very simple example:
304
305
306 <figure>
307 <p><img src="example.png" class="img-responsive" alt="example.png">
308 </p>
309 </figure>
310
311 <p>
312 Graph legend:
313 </p>
314
315
316 <figure>
317 <p><img src="legend.png" class="img-responsive" alt="legend.png">
318 </p>
319 </figure>
320 </li>
321 </ul>
322
323
324 <ul class="org-ul">
325 <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>.
326 </li>
327 </ul>
328 </div>
329 </div>
330
331 <div id="outline-container-sec-4" class="outline-2">
332 <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>
333 <div class="outline-text-2" id="text-4">
334 <p>
335 JavaInspect can be controlled in 2 different ways:
336 </p>
337 <ul class="org-ul">
338 <li><a href="#sec-4-1">as standalone commandline utility</a>
339 </li>
340 <li><a href="#sec-4-2">as embedded Java library via Java API</a>
341 </li>
342 </ul>
343 </div>
344
345 <div id="outline-container-sec-4-1" class="outline-3">
346 <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>
347 <div class="outline-text-3" id="text-4-1">
348 <p>
349 To enable commandline support, (study and) execute script:
350 </p>
351 <pre class="example">
352 commandline launcher/install
353
354 </pre>
355
356 <p>
357 Warning: It was tested only on Debian Stretch linux.
358 </p>
359
360 <p>
361 Available commandline arguments:
362 </p>
363 <p class="verse">
364 -j (existing files)&#x2026;<br >
365 &#xa0;&#xa0;&#xa0;&#xa0;JAR file(s) to render.<br >
366 <br >
367 -n (mandatory, string)<br >
368 &#xa0;&#xa0;&#xa0;&#xa0;Graph name.<br >
369 <br >
370 &#x2013;debug<br >
371 &#xa0;&#xa0;&#xa0;&#xa0;Show debug info.<br >
372 <br >
373 -k<br >
374 &#xa0;&#xa0;&#xa0;&#xa0;Keep dot file.<br >
375 <br >
376 -h<br >
377 &#xa0;&#xa0;&#xa0;&#xa0;Hide orphaned classes.<br >
378 <br >
379 -w (one to many strings)&#x2026;<br >
380 &#xa0;&#xa0;&#xa0;&#xa0;Whitelist glob(s).<br >
381 <br >
382 -b (one to many strings)&#x2026;<br >
383 &#xa0;&#xa0;&#xa0;&#xa0;Blacklist glob(s).<br >
384 <br >
385 -d (existingdirectory)<br >
386 &#xa0;&#xa0;&#xa0;&#xa0;Target directory. Default is current directory.<br >
387 <br >
388 -t (options: png, svg)<br >
389 &#xa0;&#xa0;&#xa0;&#xa0;Target image type. Default is: svg.<br >
390 </p>
391 </div>
392 </div>
393 <div id="outline-container-sec-4-2" class="outline-3">
394 <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>
395 <div class="outline-text-3" id="text-4-2">
396 <p>
397 Requires that classes to be visualised are available in the classpath.
398 </p>
399
400 <p>
401 To get JavaInspect into same classpath with your projecs I so far came
402 up with 2 solutions:
403 </p>
404
405 <ol class="org-ol">
406 <li>Add JavaInspect library in your project as a dependency.
407 </li>
408
409 <li>Create new Java project for the purpose visualizing your other
410 projects and include JavaInspect and your projecs binary artifacts
411 (Jar's) into new project classpath. Built binary Jar's (with no
412 source code) are sufficient because JavaInspect operates via
413 reflection.
414 </li>
415 </ol>
416
417 <p>
418 Simple Java based control/configuration code needs to be written for
419 each project. I usually put such code into directories devoted for
420 JUnit tests. Because it needs not to be compiled/embedded into final
421 product or project artifact I'm just willing to visualize.
422 </p>
423
424 <p>
425 Control code in general does the following:
426 </p>
427 <ol class="org-ol">
428 <li>Create graph object.
429 </li>
430 <li>Java reflection/classloaders does not provide mechanism for
431 discovering all classes under given package. Therefore you need to
432 declare at least some classes to be added to the graph by manually
433 adding individual classes to the graph. For every class added to
434 the graph, GraphViz will recursively inspect it and add all
435 referecned classes to the graph as well.
436 </li>
437 <li>Graphs easilly get very big and complex so optionally we filter
438 important code using classname <a href="https://en.wikipedia.org/wiki/Glob_(programming)">glob</a> patterns based blacklist and/or
439 whitelist.
440 </li>
441 <li>Optionally we can tune some rendering parameters like:
442 <ul class="org-ul">
443 <li>Possibility to remove orphaned classes (classes with no
444 references) from the graph.
445 </li>
446 <li>Specify target directory for generated visualization
447 files. (Default is current directory)
448 </li>
449 <li>Keep intermediate GraphViz dot file for later inspection.
450 </li>
451 </ul>
452 </li>
453 <li>Render graph.
454 </li>
455 </ol>
456 </div>
457
458
459 <div id="outline-container-sec-4-2-1" class="outline-4">
460 <h4 id="sec-4-2-1"><span class="section-number-4">4.2.1</span> example 1: individually picked objects</h4>
461 <div class="outline-text-4" id="text-4-2-1">
462 <p>
463 This example demonstrates generating of class graph from hand picked
464 classes and visualizing GraphViz itself.
465 </p>
466
467 <div class="org-src-container">
468
469 <pre class="src src-java"><span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Create graph</span>
470 <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>();
471
472 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some random object to the graph. GraphViz will detect Class from</span>
473 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">the object.</span>
474 graph.add(graph);
475
476 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Also add some random class to the graph.</span>
477 graph.add(Utils.<span style="color: #F92672;">class</span>);
478
479 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Keep intermediary GraphViz DOT file for reference.</span>
480 graph.setKeepDotFile(<span style="color: #FF80F4;">true</span>);
481
482 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Produce bitmap image titled "JavaInspect.png" to the user Desktop</span>
483 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">directory</span>
484 graph.generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>);
485
486 </pre>
487 </div>
488
489 <p>
490 Note: if desired, more compact version of the above:
491 </p>
492 <div class="org-src-container">
493
494 <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>)
495                 .setKeepDotFile(<span style="color: #FF80F4;">true</span>).generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>);
496 </pre>
497 </div>
498
499
500 <p>
501 Result:
502 </p>
503 <ul class="org-ul">
504 <li>Generated DOT file: <a href="JavaInspect.dot">JavaInspect.dot</a>
505 </li>
506 <li>Generated PNG image: <a href="JavaInspect.png">JavaInspect.png</a>
507 </li>
508 </ul>
509 </div>
510 </div>
511
512 <div id="outline-container-sec-4-2-2" class="outline-4">
513 <h4 id="sec-4-2-2"><span class="section-number-4">4.2.2</span> example 2: GraphViz embedded in another project</h4>
514 <div class="outline-text-4" id="text-4-2-2">
515 <ol class="org-ol">
516 <li>Download project Sixth <a href="https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz">code snapshot</a>.
517 </li>
518 <li>Inspect and run <b>DataGraph.java</b>.
519 </li>
520 </ol>
521 </div>
522 </div>
523
524 <div id="outline-container-sec-4-2-3" class="outline-4">
525 <h4 id="sec-4-2-3"><span class="section-number-4">4.2.3</span> Embedding JavaInspect in your Maven project</h4>
526 <div class="outline-text-4" id="text-4-2-3">
527 <p>
528 Declare JavaInspect as dependency:
529 </p>
530 <div class="org-src-container">
531
532 <pre class="src src-xml">&lt;<span style="color: #A6E22E;">dependencies</span>&gt;
533     ...
534     &lt;<span style="color: #A6E22E;">dependency</span>&gt;
535         &lt;<span style="color: #A6E22E;">groupId</span>&gt;eu.svjatoslav&lt;/<span style="color: #A6E22E;">groupId</span>&gt;
536         &lt;<span style="color: #A6E22E;">artifactId</span>&gt;javainspect&lt;/<span style="color: #A6E22E;">artifactId</span>&gt;
537         &lt;<span style="color: #A6E22E;">version</span>&gt;1.7&lt;/<span style="color: #A6E22E;">version</span>&gt;
538     &lt;/<span style="color: #A6E22E;">dependency</span>&gt;
539     ...
540 &lt;/<span style="color: #A6E22E;">dependencies</span>&gt;
541 </pre>
542 </div>
543
544
545 <p>
546 Add Maven repository to retrieve artifact from:
547 </p>
548 <div class="org-src-container">
549
550 <pre class="src src-xml">&lt;<span style="color: #A6E22E;">repositories</span>&gt;
551     ...
552     &lt;<span style="color: #A6E22E;">repository</span>&gt;
553         &lt;<span style="color: #A6E22E;">id</span>&gt;svjatoslav.eu&lt;/<span style="color: #A6E22E;">id</span>&gt;
554         &lt;<span style="color: #A6E22E;">name</span>&gt;Svjatoslav repository&lt;/<span style="color: #A6E22E;">name</span>&gt;
555         &lt;<span style="color: #A6E22E;">url</span>&gt;http://www2.svjatoslav.eu/maven/&lt;/<span style="color: #A6E22E;">url</span>&gt;
556     &lt;/<span style="color: #A6E22E;">repository</span>&gt;
557     ...
558 &lt;/<span style="color: #A6E22E;">repositories</span>&gt;
559 </pre>
560 </div>
561 </div>
562 </div>
563 </div>
564 </div>
565
566 <div id="outline-container-sec-5" class="outline-2">
567 <h2 id="sec-5"><span class="section-number-2">5</span> Requirements</h2>
568 <div class="outline-text-2" id="text-5">
569 <p>
570 <a href="http://www.graphviz.org/">GraphViz</a> - shall be installed on the computer.
571 </p>
572
573 <p>
574 On Ubuntu/Debian use:
575 </p>
576 <div class="org-src-container">
577
578 <pre class="src src-sh">sudo apt-get install graphviz
579 </pre>
580 </div>
581 </div>
582 </div>
583 <div id="outline-container-sec-6" class="outline-2">
584 <h2 id="sec-6"><span class="section-number-2">6</span> TO DO</h2>
585 <div class="outline-text-2" id="text-6">
586 <p>
587 Note: Because this is side project (and I have many of them) I can
588 only contribute few hours per year at average. Any help is welcome.  A
589 LOT of cool ideas could be implemented. For intstance:
590 </p>
591
592 <ul class="org-ul">
593 <li>BUG: Should not hide references if there are too many of them to
594 classes if referring classes are not visible anyway because of
595 blacklist/whitelist rules. Basically reference counting should
596 exclude not visible classes.
597 </li>
598
599 <li>BUG: Orphaned class removal does not work always. There are many
600 bugs and corner cases to find and fix still.
601 </li>
602
603 <li>BUG: Code is not very readable. Document and refactor for better
604 maintainability.
605 </li>
606
607 <li>FEATURE: Create installable DEB package.
608 <ul class="org-ul">
609 <li>Submit it to some Debian developer for integration or become
610 Debian package maintainer.
611 </li>
612 </ul>
613 </li>
614
615 <li>FEATURE: Make it modular. That is: central part, an application
616 model could be standalone and serializable.
617
618 <ul class="org-ul">
619 <li>There could be multiple ways to acquire model:
620 <ul class="org-ul">
621 <li>By introspecting application via Java reflections (current mode
622 of operation).
623 </li>
624 <li>By parsing java source. (unfinished)
625 </li>
626 </ul>
627 </li>
628
629 <li>There could be ways to manipulate model:
630 <ul class="org-ul">
631 <li>Store/load/compare.
632 </li>
633 <li>Trim uninteresting parts.
634 </li>
635 <li>Highlight important parts.
636 </li>
637 </ul>
638 </li>
639
640 <li>There could be multiple ways to render model:
641 <ul class="org-ul">
642 <li>PNG/SVG (currently implemented)
643 </li>
644 <li>PlantUML (TODO)
645 </li>
646 <li>Interactive 3D visualization (TODO)
647 </li>
648 </ul>
649 </li>
650 </ul>
651 </li>
652
653 <li>FEATURE: Implement (or integrate existing java parser
654 <a href="https://javaparser.org/">https://javaparser.org/</a>) to be able to produce code visualizations
655 based on source code (in addition to current reflection based
656 approach).
657 </li>
658
659 <li>FEATURE: Integarte with <a href="http://plantuml.com/class-diagram">PlantUML</a>.
660 </li>
661
662 <li>FEATURE: Add dark theme for generated graphs.
663 </li>
664
665 <li>FEATURE: Sort Class fields by alphabet.
666 </li>
667
668 <li>FEATURE: Visualize also concrete field values so it could be used as
669 ultra cool runtime logging/debugging framework.
670 </li>
671
672 <li>FEATURE: Possibility to visualize structure and data from JVM
673 snapshot.
674 </li>
675
676 <li>FEATURE: Possibility to attach to remote process to visualize
677 data/structure using JVM debug port and mechanism.
678 </li>
679
680 <li>FEATURE: Possibility to attach to JVM using JVM agent.
681 </li>
682
683 <li>FEATURE: Possibility to inspect graphs in 3D using <a href="https://www3.svjatoslav.eu/projects/sixth-3d/">Sixth 3D engine</a>.
684 </li>
685
686 <li>FEATURE: Possibility to select classes/fields/values to be
687 visualized in some graph query language. For greater flexibility in
688 comparison to currently supported glob syntax.
689 </li>
690
691 <li>FEATURE: Add option to control JavaInspect via JSON or XML config
692 file. For example different graphs for given project could be
693 defined once in plain text config, possibly with the aid of some
694 interactive utility. Then defined graphs could be updated as part of
695 project build or release process.
696 </li>
697
698 <li>FEATURE: Configurable maven plugin to generate graphs as part of the
699 project build/release process.
700 </li>
701 </ul>
702 </div>
703 </div>
704 <div id="outline-container-sec-7" class="outline-2">
705 <h2 id="sec-7"><span class="section-number-2">7</span> See also</h2>
706 <div class="outline-text-2" id="text-7">
707 <p>
708 Similar or alternative solutions:
709 </p>
710 <ul class="org-ul">
711 <li><a href="http://www.class-visualizer.net/">http://www.class-visualizer.net/</a>
712 </li>
713 </ul>
714 </div>
715 </div>
716 </div><div class="col-md-3"><nav id="table-of-contents">
717 <div id="text-table-of-contents" class="bs-docs-sidebar">
718 <ul class="nav">
719 <li><a href="#sec-1">1. General</a>
720 <ul class="nav">
721 <li><a href="#sec-1-1">1.1. Source code</a></li>
722 </ul>
723 </li>
724 <li><a href="#sec-2">2. Goal and operating principle</a></li>
725 <li><a href="#sec-3">3. Example graphs</a></li>
726 <li><a href="#sec-4">4. Usage</a>
727 <ul class="nav">
728 <li><a href="#sec-4-1">4.1. usage as commandline utility</a></li>
729 <li><a href="#sec-4-2">4.2. usage via Java API</a></li>
730 </ul>
731 </li>
732 <li><a href="#sec-5">5. Requirements</a></li>
733 <li><a href="#sec-6">6. TO DO</a></li>
734 <li><a href="#sec-7">7. See also</a></li>
735 </ul>
736 </div>
737 </nav>
738 </div></div></div>
739 <footer id="postamble" class="">
740 <div><p class="author">Author: Svjatoslav Agejenko</p>
741 <p class="date">Created: 2021-01-10 P 00:37</p>
742 <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>
743 </div>
744 </footer>
745 </body>
746 </html>