Possibility to provide classpath dir. Updated help and documentation.
[javainspect.git] / doc / index.org
index b831a37..7c62a16 100644 (file)
@@ -27,6 +27,9 @@
       https://github.com/abargnesi/javainspect
 
 ** Source code
       https://github.com/abargnesi/javainspect
 
 ** Source code
+:PROPERTIES:
+:ID:       032b7997-f582-4203-b31a-43ef7b654ed6
+:END:
 - [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz][Download latest snapshot in TAR GZ format]]
 
 - [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary][Browse Git repository online]]
 - [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=snapshot;h=HEAD;sf=tgz][Download latest snapshot in TAR GZ format]]
 
 - [[https://www2.svjatoslav.eu/gitweb/?p=javainspect.git;a=summary][Browse Git repository online]]
@@ -44,9 +47,9 @@ JavaInspect can be used as a [[id:acf1896a-74b4-4914-acf6-a77075e07f25][standalo
 [[id:bbeeffc8-3767-440d-8d93-ec9124dd60ee][java library]]. JavaInspect uses primarily Java built-in reflection to
 discover and visualize any part of Java program.
 
 [[id:bbeeffc8-3767-440d-8d93-ec9124dd60ee][java library]]. JavaInspect uses primarily Java built-in reflection to
 discover and visualize any part of Java program.
 
-JavaInspect currently has no GUI, configuration files, embedded
-scripting support, direct Maven or Ant integration. See [[id:2ad2889e-6c95-4662-b3f4-2c341fc74522][usage]] 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 [[id:2ad2889e-6c95-4662-b3f4-2c341fc74522][usage]] to learn how to instuct Javainspect what to do.
 
 After discovering application structure and optionally filtering out
 unimportant parts, JavaInspect produces GraphViz dot file that
 
 After discovering application structure and optionally filtering out
 unimportant parts, JavaInspect produces GraphViz dot file that
@@ -55,12 +58,11 @@ bitmap graph in PNG or SVG format.
 
 Notes:
 + JavaInspect is developed and tested so far only on GNU/Linux.
 
 Notes:
 + JavaInspect is developed and tested so far only on GNU/Linux.
-+ See: [[https://github.com/pahen/madge][Madge - similar tool for JavaScript]]
 
 * Example graphs
 + A very simple example:
 
 
 * Example graphs
 + A very simple example:
 
-    file:example.png
+    [[file:example.png][file:example-thumbnail.png]]
 
     Graph legend:
 
 
     Graph legend:
 
@@ -69,6 +71,31 @@ Notes:
 
 + [[https://www3.svjatoslav.eu/projects/sixth-3d/graphs/][See example produced graphs]] for [[https://www3.svjatoslav.eu/projects/sixth-3d/][Sixth 3D - 3D engine project]].
 
 
 + [[https://www3.svjatoslav.eu/projects/sixth-3d/graphs/][See example produced graphs]] for [[https://www3.svjatoslav.eu/projects/sixth-3d/][Sixth 3D - 3D engine project]].
 
+* Installation
+[[http://www.graphviz.org/][GraphViz]] - shall be installed on the computer.
+
+On Ubuntu/Debian GraphViz can be installed using:
+#+BEGIN_SRC sh
+sudo apt-get install graphviz
+#+END_SRC
+
+To use JavaInspect via Java API, no further installation is
+needed. JavaInspect will be embedded into your project as dependency.
+This is described in [[id:bbeeffc8-3767-440d-8d93-ec9124dd60ee][usage via Java API]]. It will expect GraphViz to be
+available in the system.
+
+To use JavaInspect as a commandline tool, JavaInspect source
+repository has to be cloned locally: See [[id:032b7997-f582-4203-b31a-43ef7b654ed6][Source code]].
+
+Then study and execute installation script:
+: commandline launcher/install
+
+After installation, new commandline tool should be available
+: javainspect
+
+Quick commandline usage help can be viewed by issuing
+: javainspect --help
+
 * Usage
   :PROPERTIES:
   :ID:       2ad2889e-6c95-4662-b3f4-2c341fc74522
 * Usage
   :PROPERTIES:
   :ID:       2ad2889e-6c95-4662-b3f4-2c341fc74522
@@ -77,30 +104,31 @@ JavaInspect can be controlled in 2 different ways:
 + [[id:acf1896a-74b4-4914-acf6-a77075e07f25][as standalone commandline utility]]
 + [[id:bbeeffc8-3767-440d-8d93-ec9124dd60ee][as embedded Java library via Java API]]
 
 + [[id:acf1896a-74b4-4914-acf6-a77075e07f25][as standalone commandline utility]]
 + [[id:bbeeffc8-3767-440d-8d93-ec9124dd60ee][as embedded Java library via Java API]]
 
-** usage as commandline utility
+** Usage as commandline utility
    :PROPERTIES:
    :ID:       acf1896a-74b4-4914-acf6-a77075e07f25
    :END:
    :PROPERTIES:
    :ID:       acf1896a-74b4-4914-acf6-a77075e07f25
    :END:
-To enable commandline support, (study and) execute script:
-: commandline launcher/install
-
-Warning: It was tested only on Debian Stretch linux.
-
-Available commandline arguments:
+*** Available commandline arguments
 #+BEGIN_VERSE
 -j (existing files)...
     JAR file(s) to render.
 
 #+BEGIN_VERSE
 -j (existing files)...
     JAR file(s) to render.
 
--n (mandatory, string)
-    Graph name.
+-c (existing directories)...
+    Classpath directories
+
+-n (string)
+    Graph name. (default: "graph")
 
 --debug
     Show debug info.
 
 
 --debug
     Show debug info.
 
+-h, --help
+    Show commandline usage help.
+
 -k
     Keep dot file.
 
 -k
     Keep dot file.
 
--h
+-ho
     Hide orphaned classes.
 
 -w (one to many strings)...
     Hide orphaned classes.
 
 -w (one to many strings)...
@@ -109,13 +137,50 @@ Available commandline arguments:
 -b (one to many strings)...
     Blacklist glob(s).
 
 -b (one to many strings)...
     Blacklist glob(s).
 
--d (existingdirectory)
+-r (one to many strings)...
+    root class(es).
+
+-d (existing directory)
     Target directory. Default is current directory.
 
 -t (options: png, svg)
     Target image type. Default is: svg.
 #+END_VERSE
     Target directory. Default is current directory.
 
 -t (options: png, svg)
     Target image type. Default is: svg.
 #+END_VERSE
-** usage via Java API
+*** Specifying classes to render
+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.
+
+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.
+
+JavaInspect can digest compiled Java classes in 2 modes:
+1. Provide list of Jar files. Use *-j* option.
+2. Provide list of filesystem directories that can be used as
+   classpath root. Use *-c* option.
+
+Currently JavaInspect uses following algorithm to add classes to
+rendered graph:
+
+- All classes that were found in Jar files are added to graph by default.
+- 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)
+- If whitelist is specified (*-w* option) everything that is not
+  matched by whitelist pattern(s) will be removed from the graph.
+- If blacklist is specified (*-b* option) everything that is matched
+  by blacklist pattern(s) will be removed from the graph.
+- Root classes can be specified using *-r* 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.
+
+** Usage via Java API
    :PROPERTIES:
    :ID:       bbeeffc8-3767-440d-8d93-ec9124dd60ee
    :END:
    :PROPERTIES:
    :ID:       bbeeffc8-3767-440d-8d93-ec9124dd60ee
    :END:
@@ -157,7 +222,7 @@ Control code in general does the following:
 5. Render graph.
 
 
 5. Render graph.
 
 
-*** example 1: individually picked objects
+*** Example 1: individually picked objects
 This example demonstrates generating of class graph from hand picked
 classes and visualizing GraphViz itself.
 
 This example demonstrates generating of class graph from hand picked
 classes and visualizing GraphViz itself.
 
@@ -193,7 +258,7 @@ Result:
     - Generated DOT file: [[file:JavaInspect.dot][JavaInspect.dot]]
     - Generated PNG image: [[file:JavaInspect.png][JavaInspect.png]]
 
     - Generated DOT file: [[file:JavaInspect.dot][JavaInspect.dot]]
     - Generated PNG image: [[file:JavaInspect.png][JavaInspect.png]]
 
-*** example 2: GraphViz embedded in another project
+*** Example 2: GraphViz embedded in another project
 1. Download project Sixth [[https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz][code snapshot]].
 2. Inspect and run *DataGraph.java*.
 
 1. Download project Sixth [[https://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=snapshot;h=HEAD;sf=tgz][code snapshot]].
 2. Inspect and run *DataGraph.java*.
 
@@ -226,13 +291,6 @@ Add Maven repository to retrieve artifact from:
 </repositories>
 #+END_SRC
 
 </repositories>
 #+END_SRC
 
-* Requirements
-[[http://www.graphviz.org/][GraphViz]] - shall be installed on the computer.
-
-On Ubuntu/Debian use:
-#+BEGIN_SRC sh
-sudo apt-get install graphviz
-#+END_SRC
 * TO DO
 Note: Because this is side project (and I have many of them) I can
 only contribute few hours per year at average. Any help is welcome.  A
 * TO DO
 Note: Because this is side project (and I have many of them) I can
 only contribute few hours per year at average. Any help is welcome.  A
@@ -310,3 +368,4 @@ LOT of cool ideas could be implemented. For intstance:
 * See also
 Similar or alternative solutions:
 + http://www.class-visualizer.net/
 * See also
 Similar or alternative solutions:
 + http://www.class-visualizer.net/
++ [[https://github.com/pahen/madge][Madge - similar tool for JavaScript]]