minor documentation update
[javainspect.git] / doc / index.html
index c574de5..4c426bf 100644 (file)
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
 <title>JavaInspect - Utility to visualize java software</title>
-<!-- 2015-02-03 Tue 20:24 -->
+<!-- 2015-03-07 Sat 00:10 -->
 <meta  http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta  name="generator" content="Org-mode" />
 <meta  name="author" content="Svjatoslav Agejenko" />
@@ -144,23 +144,30 @@ for the JavaScript code in this tag.
 <div id="text-table-of-contents">
 <ul>
 <li><a href="#sec-1">1. General</a></li>
-<li><a href="#sec-2">2. Current status</a></li>
-<li><a href="#sec-3">3. Example graphs</a></li>
-<li><a href="#sec-4">4. Usage example 1</a></li>
-<li><a href="#sec-5">5. Usage example 2</a></li>
-<li><a href="#sec-6">6. Embedding JavaInspect in your Maven project</a></li>
-<li><a href="#sec-7">7. Requirements</a></li>
-<li><a href="#sec-8">8. <span class="todo TODO">TODO</span> </a></li>
+<li><a href="#sec-2">2. Example graphs</a></li>
+<li><a href="#sec-3">3. Usage</a>
+<ul>
+<li><a href="#sec-3-1">3.1. example 1: individually picked objects</a></li>
+<li><a href="#sec-3-2">3.2. example 2: scan java code, apply filters</a></li>
+<li><a href="#sec-3-3">3.3. example 3: GraphViz embedded in another project</a></li>
+</ul>
+</li>
+<li><a href="#sec-4">4. Embedding JavaInspect in your Maven project</a></li>
+<li><a href="#sec-5">5. Requirements</a></li>
+<li><a href="#sec-6">6. <span class="todo TODO">TODO</span> </a></li>
 </ul>
 </div>
 </div>
 <hr  />
-
 <ul class="org-ul">
-<li><a href="http://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz">download</a>
+<li><a href="http://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz">download latest snapshot</a>
 </li>
-<li><a href="http://svjatoslav.eu/programs.jsp">other applications hosted at svjatoslav.eu</a>
+
+<li>This program is free software; you can redistribute it and/or modify
+it under the terms of version 3 of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public
+License</a> or later as published by the Free Software Foundation.
 </li>
+
 <li>Program author:
 <ul class="org-ul">
 <li>Svjatoslav Agejenko
@@ -171,6 +178,9 @@ for the JavaScript code in this tag.
 </li>
 </ul>
 </li>
+
+<li><a href="http://svjatoslav.eu/programs.jsp">other applications hosted at svjatoslav.eu</a>
+</li>
 </ul>
 
 <div id="outline-container-sec-1" class="outline-2">
@@ -182,43 +192,51 @@ automatically visualizing its structure.
 </p>
 
 <p>
-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 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.
 </p>
 
 <p>
-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.
+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.
 </p>
-</div>
-</div>
 
-<div id="outline-container-sec-2" class="outline-2">
-<h2 id="sec-2"><span class="section-number-2">2</span> Current status</h2>
-<div class="outline-text-2" id="text-2">
 <p>
-This is simple utility, quickly written. Tested on GNU 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.
+To get JavaInspect into same classpath with your projecs I so far came
+up with 2 solutions:
 </p>
-</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 class="outline-text-2" id="text-3">
+<ol class="org-ol">
+<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>
+</ol>
+
 <p>
-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>.
+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.
 </p>
 
 <p>
-A very simple example:
+Note: GraphViz is developed and tested so far only on GNU Linux.
 </p>
+</div>
+</div>
+
+<div id="outline-container-sec-2" class="outline-2">
+<h2 id="sec-2"><span class="section-number-2">2</span> Example graphs</h2>
+<div class="outline-text-2" id="text-2">
+<ul class="org-ul">
+<li>A very simple example:
 
 
 <div class="figure">
@@ -226,7 +244,6 @@ A very simple example:
 </p>
 </div>
 
-
 <p>
 Graph legend:
 </p>
@@ -236,15 +253,73 @@ Graph legend:
 <p><img src="legend.png" alt="legend.png" />
 </p>
 </div>
+</li>
+
+<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>.
+</li>
+</ul>
 </div>
 </div>
 
-<div id="outline-container-sec-4" class="outline-2">
-<h2 id="sec-4"><span class="section-number-2">4</span> Usage example 1</h2>
-<div class="outline-text-2" id="text-4">
+<div id="outline-container-sec-3" class="outline-2">
+<h2 id="sec-3"><span class="section-number-2">3</span> Usage</h2>
+<div class="outline-text-2" id="text-3">
+<p>
+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.
+</p>
+
+<p>
+Control code in general does the following:
+</p>
+<ol class="org-ol">
+<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:
+<ul class="org-ul">
+<li>Manually adding individual classes to the graph.
+</li>
+<li>and/or: Let GraphViz recursively scan and parse specified
+directories with Java source code files to discover class names.
+</li>
+<li>For every class added to the graph, GraphViz will recursively
+inspect it and add all referecned classes to the graph as well.
+</li>
+</ul>
+</li>
+<li>Graphs easilly get very big and complex so optionally we filter
+important code using classname wildcards patterns based blacklist
+and/or 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>
+<li>Specify target directory for generated visualization
+files. (Default is user desktop 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-3-1" class="outline-3">
+<h3 id="sec-3-1"><span class="section-number-3">3.1</span> example 1: individually picked objects</h3>
+<div class="outline-text-3" id="text-3-1">
 <p>
 This example demonstrates generating of class graph from hand picked
-classes.
+classes and visualizing GraphViz itself.
 </p>
 
 <div class="org-src-container">
@@ -252,22 +327,31 @@ classes.
 <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;">While classes and objects can be immediately passed to ClassGraph</span>
-<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">constructor as arguments, it is also possible to add them one by</span>
-<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">one as in the following example.</span>
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some random object to the graph. GraphViz will detect Class from</span>
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">the object.</span>
+graph.add(graph);
 
-<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some object to the graph.</span>
-graph.addObject(graph);
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Also add some random class to the graph.</span>
+graph.add(Utils.<span style="color: #F92672;">class</span>);
 
-<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Add some class to the graph.</span>
-graph.addClass(Utils.<span style="color: #F92672;">class</span>);
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Keep intermediary GraphViz DOT file for reference.</span>
+graph.setKeepDotFile(<span style="color: #FF80F4;">true</span>);
 
 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Produce bitmap image titled "JavaInspect.png" to the user Desktop</span>
-<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">directory and keep intermediary GraphViz DOT file for reference.</span>
-graph.generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>, <span style="color: #FF80F4;">true</span>);
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">directory</span>
+graph.generateGraph(<span style="color: #EEDC82;">"JavaInspect"</span>);
 </pre>
 </div>
 
+<p>
+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>
+</div>
 
 
 <p>
@@ -282,21 +366,20 @@ Result:
 </div>
 </div>
 
-<div id="outline-container-sec-5" class="outline-2">
-<h2 id="sec-5"><span class="section-number-2">5</span> Usage example 2</h2>
-<div class="outline-text-2" id="text-5">
-<p>
-Recursively scan current directory for Java source code and attempt to
-detect class names from there to be added to the graph.
-</p>
-
+<div id="outline-container-sec-3-2" class="outline-3">
+<h3 id="sec-3-2"><span class="section-number-3">3.2</span> example 2: scan java code, apply filters</h3>
+<div class="outline-text-3" id="text-3-2">
 <div class="org-src-container">
 
-<pre class="src src-java">graph.addProject(<span style="color: #EEDC82;">"."</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;">Recursively scan current directory for Java source code and attempt</span>
+<span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">to detect class names from there to be added to the graph.</span>
+graph.addProject(<span style="color: #EEDC82;">"."</span>);
 
 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">Blacklist example classes from being shown on the graph</span>
-graph.getFilter().blacklistClassPattern(
-    <span style="color: #EEDC82;">"eu.svjatoslav.inspector.java.structure.example.*"</span>);
+graph.blacklistClassPattern(<span style="color: #EEDC82;">"eu.svjatoslav.inspector.java.structure.example.*"</span>);
 
 <span style="color: #8C8C8C;">// </span><span style="color: #8C8C8C;">do not show single classes with no relationships on the graph</span>
 graph.hideOrphanedClasses();
@@ -316,9 +399,22 @@ Result:
 </div>
 </div>
 
-<div id="outline-container-sec-6" class="outline-2">
-<h2 id="sec-6"><span class="section-number-2">6</span> Embedding JavaInspect in your Maven project</h2>
-<div class="outline-text-2" id="text-6">
+<div id="outline-container-sec-3-3" class="outline-3">
+<h3 id="sec-3-3"><span class="section-number-3">3.3</span> example 3: GraphViz embedded in another project</h3>
+<div class="outline-text-3" id="text-3-3">
+<ol class="org-ol">
+<li>Download project Sixth <a href="http://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>
+
+<div id="outline-container-sec-4" class="outline-2">
+<h2 id="sec-4"><span class="section-number-2">4</span> Embedding JavaInspect in your Maven project</h2>
+<div class="outline-text-2" id="text-4">
 <p>
 Declare JavaInspect as dependency:
 </p>
@@ -329,7 +425,7 @@ Declare JavaInspect as dependency:
     &lt;<span style="color: #A6E22E;">dependency</span>&gt;
         &lt;<span style="color: #A6E22E;">groupId</span>&gt;eu.svjatoslav&lt;/<span style="color: #A6E22E;">groupId</span>&gt;
         &lt;<span style="color: #A6E22E;">artifactId</span>&gt;javainspect&lt;/<span style="color: #A6E22E;">artifactId</span>&gt;
-        &lt;<span style="color: #A6E22E;">version</span>&gt;1.3&lt;/<span style="color: #A6E22E;">version</span>&gt;
+        &lt;<span style="color: #A6E22E;">version</span>&gt;1.5-SNAPSHOT&lt;/<span style="color: #A6E22E;">version</span>&gt;
     &lt;/<span style="color: #A6E22E;">dependency</span>&gt;
     ...
 &lt;/<span style="color: #A6E22E;">dependencies</span>&gt;
@@ -356,9 +452,9 @@ Add Maven repository to retrieve artifact from:
 </div>
 </div>
 
-<div id="outline-container-sec-7" class="outline-2">
-<h2 id="sec-7"><span class="section-number-2">7</span> Requirements</h2>
-<div class="outline-text-2" id="text-7">
+<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>
@@ -366,24 +462,22 @@ Add Maven repository to retrieve artifact from:
 <p>
 On Ubuntu/Debian use:
 </p>
-<pre class="example">
-sudo apt-get install graphviz
+<div class="org-src-container">
+
+<pre class="src src-sh">sudo apt-get install graphviz
 </pre>
 </div>
 </div>
-<div id="outline-container-sec-8" class="outline-2">
-<h2 id="sec-8"><span class="section-number-2">8</span> <span class="todo TODO">TODO</span> </h2>
-<div class="outline-text-2" id="text-8">
+</div>
+<div id="outline-container-sec-6" class="outline-2">
+<h2 id="sec-6"><span class="section-number-2">6</span> <span class="todo TODO">TODO</span> </h2>
+<div class="outline-text-2" id="text-6">
 <ul class="org-ul">
 <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>
-<li>BUG: Current code is quite messy (because of lack of time) things
-were implemented ad-hoc. Needs cleanup/refactoring for better
-readability.
-</li>
 <li>FEATURE: add dark theme
 </li>
 <li>FEATURE: sort Class fields by alphabet
@@ -413,7 +507,7 @@ project build/release process
 </div>
 <div id="postamble" class="status">
 <p class="author">Author: Svjatoslav Agejenko</p>
-<p class="date">Created: 2015-02-03 Tue 20:24</p>
+<p class="date">Created: 2015-03-07 Sat 00:10</p>
 <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>
 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>