2012-02-15 20 views

Respuesta

16

Modifiqué ligeramente la respuesta de @ wuppi para también ocultar las rutas de clases y las anotaciones largas de nombres aleatorios para hacer que el gráfico sea mucho más compacto y legible. Su answer con el código editado a continuación:

Me parece que este método de utilidad es bastante útil y nunca me dio gráficamente gráficos incorrectos.

En cuanto al error style=invis: El complemento Guifo grapher genera un archivo de puntos, que hace que algunas clases sean invisibles. El replaceAll() en el método publicado a continuación funciona alrededor de eso. El resto del código es casi el mismo del ejemplo de Guice.

he incorporado solución de Scot para Guice 4.x, que incluía la respuesta de Tim así:

public class Grapher { 
    public static void main(String[] args) throws Exception { 
     Grapher.graph4("filename.dot", Guice.createInjector(new MyModule())); 
    } 
    public static void graph4(String filename, Injector inj) throws Exception { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PrintWriter out = new PrintWriter(baos); 

     Injector injector = Guice.createInjector(new GraphvizModule()); 
     GraphvizGrapher renderer = injector.getInstance(GraphvizGrapher.class); 
     renderer.setOut(out); 
     renderer.setRankdir("TB"); 
     renderer.graph(inj);  

     out = new PrintWriter(new File(filename), "UTF-8"); 
     String s = baos.toString("UTF-8"); 
     s = fixGrapherBug(s); 
     s = hideClassPaths(s); 
     out.write(s); 
     out.close(); 
    } 

    public static String hideClassPaths(String s) { 
     s = s.replaceAll("\\w[a-z\\d_\\.]+\\.([A-Z][A-Za-z\\d_\\$]*)", "$1"); 
     s = s.replaceAll("value=[\\w-]+", "random"); 
     return s; 
    } 

    public static String fixGrapherBug(String s) { 
     s = s.replaceAll("style=invis", "style=solid"); 
     s = s.replaceAll("margin=(\\S+), ", " margin=\"$1\", "); 
     return s; 
    } 
} 

Por supuesto que son libres para generar cualquier otro Nombre del archivo :)

+0

Jeff, no sé si viste la respuesta de @ Tim, pero es necesaria para la última versión de graphviz y Guice 3.0. No lo intenté con 4.0 beta todavía. – durron597

+0

@ durron597 actualizado, gracias. –

2

Cuando se utiliza la mayor parte versión reciente de GraphViz, me parece que la siguiente sustitución también ayuda (de lo contrario GraphViz se niega a abrir el archivo):

s.replaceAll(" margin=(\\S+), ", " margin=\"$1\", ") 
5

Guice 4.x ejemplo la incorporación de Jeff y Tim SOLUTIO ns:

public class Grapher { 
    public static void main(String[] args) throws Exception { 
     Grapher.graph4("filename.dot", Guice.createInjector(new MyModule())); 
    } 
    public static void graph4(String filename, Injector inj) throws Exception { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PrintWriter out = new PrintWriter(baos); 

     Injector injector = Guice.createInjector(new GraphvizModule()); 
     GraphvizGrapher renderer = injector.getInstance(GraphvizGrapher.class); 
     renderer.setOut(out); 
     renderer.setRankdir("TB"); 
     renderer.graph(inj);  

     out = new PrintWriter(new File(filename), "UTF-8"); 
     String s = baos.toString("UTF-8"); 
     s = fixGrapherBug(s); 
     s = hideClassPaths(s); 
     out.write(s); 
     out.close(); 
    } 

    public static String hideClassPaths(String s) { 
     s = s.replaceAll("\\w[a-z\\d_\\.]+\\.([A-Z][A-Za-z\\d_]*)", ""); 
     s = s.replaceAll("value=[\\w-]+", "random"); 
     return s; 
    } 

    public static String fixGrapherBug(String s) { 
     s = s.replaceAll("style=invis", "style=solid"); 
     s = s.replaceAll("margin=(\\S+), ", " margin=\"$1\", "); 
     return s; 
    } 
} 
+1

Corrección de errores pequeños: en la versión actual de guice-grapher que estoy usando (4.0-beta), la palabra clave 'margen' no tiene un espacio delante, por lo que la línea de reemplazo debe ser: s = s .replaceAll ("margen = (\\ S +)", "margen = \" $ 1 \ ","); De lo contrario, muchas gracias por la muestra. – chooks

-1

La primera replaceAll en los hideClassPaths() método anterior es demasiado entusiastas - que elimina el nombre de clase, así como el paquete. Debe ser

s = s.replaceAll("\\w[a-z\\d_\\.]+\\.([A-Z][A-Za-z\\d_\\$]*)", "$1"); 

Tenga en cuenta la adición del signo de dólar así que esto también funciona para los nombres de clase internos.

+1

Gracias! Por favor borre esta respuesta y coméntela o edite la respuesta incorrecta. –

+0

@JeffAxelrod Copié el código en su respuesta –

Cuestiones relacionadas