X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=doc%2Findex.html;h=9bbe3f6e8b594da19e195669f2b83a0ac7bb0a0d;hb=8fca62d9f6b263ff2fc41d49155afdaafc113ae1;hp=58364492dce277453099f39f1ac5f6215bd66435;hpb=827fc6629a9905006ebef0274d0271386e68d128;p=javainspect.git diff --git a/doc/index.html b/doc/index.html index 5836449..9bbe3f6 100644 --- a/doc/index.html +++ b/doc/index.html @@ -1,270 +1,428 @@ - - - + + - - - JavaInspect - Utility to visualize java software - - + + + + + + + + + - -
-

JavaInspect - Utility to visualize java software

-
-

Table of Contents

-
-
    -
  • 1. General
  • -
  • 2. Example graphs
  • -
  • 3. Usage -
      -
    • 3.1. example 1: individually picked objects
    • -
    • 3.2. example 2: scan java code, apply filters
    • -
    • 3.3. example 3: GraphViz embedded in another project
    • +
      +

      JavaInspect - Utility to visualize java software

      + +
      +

      1 General

      +
      +
      -
      -
      + +
      +

      1.1 Source code

      +
      +
      +
      +
      -
      -

      1 General

      -
      +
      +

      2 Goal and operating principle

      +

      Goal: simplify/speed up understanding the computer program code by automatically visualizing its structure.

      -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. +See example produced graphs for Sixth 3D - 3D engine project.

      -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. +JavaInspect can be used as a standalone commandline utility as well as +java library. JavaInspect uses primarily Java built-in reflection to +discover and visualize any part of Java program.

      -To get JavaInspect into same classpath with your projecs I so far came -up with 2 solutions: +JavaInspect currently has no GUI, configuration files, embedded +scripting support, direct Maven or Ant integration. See usage to learn +how to instuct Javainspect what to do.

      -
        -
      1. Add JavaInspect library in your project as a dependency.
      2. -
      3. 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.
      4. -
      -

      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. +bitmap graph in PNG or SVG format.

      -Note: GraphViz is developed and tested so far only on GNU Linux. +By default on your Desktop directory when operated in library mode or +current working directory when operated as standalone commandline +application.

      + +

      +Notes: +

      +
      -
      -

      2 Example graphs

      -
      +
      +

      3 Example graphs

      +
        -
      • -A very simple example: -

        +
      • A very simple example: -
        -

        example.resized.png +

        +

        example.png

        -
        +

        Graph legend:

        -
        -

        legend.png +

        +

        legend.png

        -
      • + + +
      -
    • Example visualization of Sixth project: architecture graphs.
    • + +
      -
      -

      3 Usage

      -
      +
      +

      4 Usage

      +

      -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 +JavaInspect can be controlled in 2 different ways: +

      + +
      + +
      +

      4.1 usage as commandline utility

      +
      +

      +To enable commandline support, (study and) execute script: +

      +
      +commandline launcher/install
      +
      +
      + +

      +Warning: It was tested only on Debian Stretch linux. +

      + +

      +Available commandline arguments: +

      +

      +-j (existing files)…
      +    JAR file(s) to render.
      +
      +-n (mandatory, string)
      +    Graph name.
      +
      +–debug
      +    Show debug info.
      +
      +-k
      +    Keep dot file.
      +
      +-h
      +    Hide orphaned classes.
      +
      +-w (one to many strings)…
      +    Whitelist glob(s).
      +
      +-b (one to many strings)…
      +    Blacklist glob(s).
      +
      +-d (existingdirectory)
      +    Target directory. Default is current directory.
      +
      +-t (options: png, svg)
      +    Target image type. Default is: svg.
      +

      +
      +
      +
      +

      4.2 usage via Java API

      +
      +

      +Requires that classes to be visualised are available in the classpath. +

      + +

      +To get JavaInspect into same classpath with your projecs I so far came +up with 2 solutions: +

      + +
        +
      1. Add JavaInspect library in your project as a dependency. +
      2. + +
      3. 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. +
      4. +
      + +

      +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.

      @@ -273,36 +431,47 @@ product or project artifact I'm just willing to visualize. Control code in general does the following:

        -
      1. Create graph object.
      2. +
      3. Create graph object. +
      4. 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.
        • +
        • Manually adding individual classes to the graph. +
        • and/or: Let GraphViz recursively scan and parse specified -directories with Java source code files to discover class names.
        • +directories with Java source code files to discover class names. +
        • For every class added to the graph, GraphViz will recursively -inspect it and add all referecned classes to the graph as well.
        • -
      5. +inspect it and add all referecned classes to the graph as well. + +
    +
  • Graphs easilly get very big and complex so optionally we filter important code using classname wildcards patterns based blacklist -and/or whitelist.
  • +and/or whitelist. +
  • Optionally we can tune some rendering parameters like:
    • Possibility to remove orphaned classes (classes with no -references) from the graph.
    • +references) from the graph. +
    • Specify target directory for generated visualization -files. (Default is user desktop directory)
    • -
    • Keep intermediate GraphViz dot file for later inspection.
    • -
  • -
  • Render graph.
  • +files. (Default is user desktop directory) + +
  • Keep intermediate GraphViz dot file for later inspection. +
  • +
+ +
  • Render graph. +
  • -
    -

    3.1 example 1: individually picked objects

    -
    +
    +

    4.2.1 example 1: individually picked objects

    +

    This example demonstrates generating of class graph from hand picked classes and visualizing GraphViz itself. @@ -310,22 +479,24 @@ classes and visualizing GraphViz itself.

    -
    // Create graph
    -final ClassGraph graph = new ClassGraph();
    +
    +// Create graph
    +final ClassGraph graph = new ClassGraph();
    +
    +// Add some random object to the graph. GraphViz will detect Class from
    +// the object.
    +graph.add(graph);
     
    -// Add some random object to the graph. GraphViz will detect Class from
    -// the object.
    -graph.add(graph);
    +// Also add some random class to the graph.
    +graph.add(Utils.class);
     
    -// Also add some random class to the graph.
    -graph.add(Utils.class);
    +// Keep intermediary GraphViz DOT file for reference.
    +graph.setKeepDotFile(true);
     
    -// Keep intermediary GraphViz DOT file for reference.
    -graph.setKeepDotFile(true);
    +// Produce bitmap image titled "JavaInspect.png" to the user Desktop
    +// directory
    +graph.generateGraph("JavaInspect");
     
    -// Produce bitmap image titled "JavaInspect.png" to the user Desktop
    -// directory
    -graph.generateGraph("JavaInspect");
     
    @@ -334,8 +505,8 @@ Note: if desired, more compact version of the above:

    -
    new ClassGraph().add(randomObject, RandomClass.class)
    -                .setKeepDotFile(true).generateGraph("JavaInspect");
    +
    new ClassGraph().add(randomObject, RandomClass.class)
    +                .setKeepDotFile(true).generateGraph("JavaInspect");
     
    @@ -344,72 +515,76 @@ Note: if desired, more compact version of the above: Result:

    -
    -

    3.2 example 2: scan java code, apply filters

    -
    +
    +

    4.2.2 example 2: scan java code, apply filters

    +
    -
    // Create graph
    -final ClassGraph graph = new ClassGraph();
    +
    // Create graph
    +final ClassGraph graph = new ClassGraph();
     
    -// Recursively scan current directory for Java source code and attempt
    -// to detect class names from there to be added to the graph.
    -graph.addProject(".");
    +// Recursively scan current directory for Java source code and attempt
    +// to detect class names from there to be added to the graph.
    +graph.addProject(".");
     
    -// Blacklist example classes from being shown on the graph
    -graph.blacklistClassPattern("eu.svjatoslav.inspector.java.structure.example.*");
    +// Blacklist example classes from being shown on the graph
    +graph.blacklistClassPattern("eu.svjatoslav.inspector.java.structure.example.*");
     
    -// do not show single classes with no relationships on the graph
    -graph.hideOrphanedClasses();
    +// do not show single classes with no relationships on the graph
    +graph.hideOrphanedClasses();
     
    -// Produce bitmap image titled "JavaInspect full project.png" to the
    -// user Desktop directory.
    -graph.generateGraph("JavaInspect full project");
    +// Produce bitmap image titled "JavaInspect full project.png" to the
    +// user Desktop directory.
    +graph.generateGraph("JavaInspect full project");
     

    Result:

    -
    -

    3.3 example 3: GraphViz embedded in another project

    -
    +
    +

    4.2.3 example 3: GraphViz embedded in another project

    +
      -
    1. Download project Sixth code snapshot.
    2. -
    3. Inspect and run *DataGraph.java*.
    4. +
    5. Download project Sixth code snapshot. +
    6. +
    7. Inspect and run *DataGraph.java*. +
    -
    -
    -

    4 Embedding JavaInspect in your Maven project

    -
    +
    +

    4.2.4 Embedding JavaInspect in your Maven project

    +

    Declare JavaInspect as dependency:

    -
    <dependencies>
    +
    <dependencies>
         ...
    -    <dependency>
    -        <groupId>eu.svjatoslav</groupId>
    -        <artifactId>javainspect</artifactId>
    -        <version>1.5</version>
    -    </dependency>
    +    <dependency>
    +        <groupId>eu.svjatoslav</groupId>
    +        <artifactId>javainspect</artifactId>
    +        <version>1.6</version>
    +    </dependency>
         ...
    -</dependencies>
    +</dependencies>
     
    @@ -419,22 +594,24 @@ Add Maven repository to retrieve artifact from:

    -
    <repositories>
    +
    <repositories>
         ...
    -    <repository>
    -        <id>svjatoslav.eu</id>
    -        <name>Svjatoslav repository</name>
    -        <url>http://www2.svjatoslav.eu/maven/</url>
    -    </repository>
    +    <repository>
    +        <id>svjatoslav.eu</id>
    +        <name>Svjatoslav repository</name>
    +        <url>http://www2.svjatoslav.eu/maven/</url>
    +    </repository>
         ...
    -</repositories>
    +</repositories>
     
    +
    +
    -
    -

    5 Requirements

    +
    +

    5 Requirements

    GraphViz - shall be installed on the computer. @@ -450,35 +627,152 @@ On Ubuntu/Debian use:

    -
    -

    6 TO DO

    +
    +

    6 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 +LOT of cool ideas could be implemented. For intstance: +

    + +
      +
    • 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. +
    • + +
    • BUG: Orphaned class removal does not work always. There are many +bugs and corner cases to find and fix still. +
    • + +
    • BUG: Code is not very readable. Document and refactor for better +maintainability. +
    • + +
    • FEATURE: Create installable DEB package.
        -
      • 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.
      • -
      • FEATURE: add dark theme
      • -
      • FEATURE: sort Class fields by alphabet
      • -
      • FEATURE: visualize also concrete field values so it could be used as -ultra cool runtime logging framework
      • -
      • FEATURE: possibility to visualize structure and data from JVM -snapshot
      • -
      • FEATURE: possibility to attach to remote process to visualize -data/structure using JVM debug port and mechanism.
      • -
      • FEATURE: possibility to attach to JVM using JVM agent
      • -
      • FEATURE: possibility to script javainspect behavior
      • -
      • FEATURE: possibility to select classes/fields/values to be -visualized in SQL like syntax
      • -
      • FEATURE: configurable maven plugin to generate graphs as part of the -project build/release process
      • +
      • Submit it to some Debian developer for integration or become +Debian package maintainer. +
      • +
      +
    • + +
    • FEATURE: Make it modular. That is: central part, an application +model could be standalone and serializable. + +
        +
      • There could be multiple ways to acquire model: +
          +
        • By introspecting application via Java reflections (current mode +of operation). +
        • +
        • By parsing java source. (unfinished) +
        • +
        +
      • + +
      • There could be ways to manipulate model: +
          +
        • Store/load/compare. +
        • +
        • Trim uninteresting parts. +
        • +
        • Highlight important parts. +
        • +
        +
      • + +
      • There could be multiple ways to render model: +
          +
        • PNG/SVG (currently implemented) +
        • +
        • PlantUML (TODO) +
        • +
        • Interactive 3D visualization (TODO) +
        • +
        +
      • +
      +
    • + +
    • FEATURE: Replace internal java parser in package +eu.svjatoslav.inspector.java.methods with: https://javaparser.org/ +
    • + +
    • FEATURE: Integarte with PlantUML. +
    • + +
    • FEATURE: Add dark theme for generated graphs. +
    • + +
    • FEATURE: Sort Class fields by alphabet. +
    • + +
    • FEATURE: Visualize also concrete field values so it could be used as +ultra cool runtime logging/debugging framework. +
    • + +
    • FEATURE: Possibility to visualize structure and data from JVM +snapshot. +
    • + +
    • FEATURE: Possibility to attach to remote process to visualize +data/structure using JVM debug port and mechanism. +
    • + +
    • FEATURE: Possibility to attach to JVM using JVM agent. +
    • + +
    • FEATURE: Possibility to inspect graphs in 3D using Sixth 3D engine. +
    • + +
    • 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. +
    • + +
    • 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. +
    • + +
    • FEATURE: Configurable maven plugin to generate graphs as part of the +project build/release process. +
    +
    +