PUBLIC OBJECT

Wanted: Guice Injector Graphing

One of the nice new features of Guice 2.0 is the new introspection API. It's the equivalent of java.lang.reflect for Guice - it lets you inspect your application at runtime. Our goal is to make it easy to write rich tools for Guice. A natural use case is visualizing an application. The right graph can reveal the structure of your application. I've opened a feature request for this, Issue 213. I created a proof-of-concept to drum-up excitement for this idea.

Example Graph: Application Code

class DeLorean {
  @Inject TimeCircuits timeCircuits;
  @Inject FluxCapacitor fluxCapacitor;
  @Inject EnergySource energySource;
}

class FluxCapacitor {
  @Inject TimeCircuits timeCircuits;
}

class TimeCircuits {
  Date whereYouveBeen;
  Date whereYouAre;
  Date whereYourGoing;
}

interface EnergySource {
  String generateOnePointTwentyOneGigawatts();
}

class Plutonium implements EnergySource {
  public String generateOnePointTwentyOneGigawatts() {
    return "newk-you-ler";
  }
}`</pre>

###  Example Graph: Guice Configuration

<pre class="prettyprint">`    Injector injector = Guice.createInjector(new AbstractModule() {
      protected void configure() {
        bind(EnergySource.class).to(Plutonium.class);
        bind(FluxCapacitor.class);
        bind(DeLorean.class);
      }
    });`</pre>

### .dot File

My `Grapher` code takes the above Injector and outputs a `.dot` file that describes a graph:
<pre>`digraph injector {
  "FluxCapacitor" -> "FluxCapacitor.<init>()" [arrowhead=onormal];
  "FluxCapacitor" -> "TimeCircuits" [label=timeCircuits]
  "DeLorean" -> "DeLorean.<init>()" [arrowhead=onormal];
  "DeLorean" -> "TimeCircuits" [label=timeCircuits]
  "DeLorean" -> "FluxCapacitor" [label=fluxCapacitor]
  "DeLorean" -> "EnergySource" [label=energySource]
  "EnergySource" -> "Plutonium" [arrowhead=onormal];
}</init></init>

The Rendered Graph

Finally, Graphviz renders the .dot file to a pretty picture:

This graph is a good start, but there's a long way to go. Unfortunately, I don't have the bandwidth to take this project to completion and am seeking a contributor. If you're interested, post a note on the issue. Coding is its own reward!