2012-02-15 9 views

risposta

16

Ho modificato leggermente la risposta di @ wuppi per nascondere anche i percorsi di classe e le annotazioni lunghe di nomi casuali per rendere il grafico molto più compatto e leggibile. Segue il suo codice answer con codice modificato:

Trovo che questo metodo di utilità sia piuttosto utile e non presta mai grafici errati per me.

Per quanto riguarda il bug style=invis: Il plug-in Guice Grapher genera un file di punti che consente di rendere invisibili alcuni dei clases. Lo replaceAll() nel metodo sotto riportato funziona su questo. Il resto del codice è quasi lo stesso dell'esempio di Guice.

Ho incorporato correzione di Scot per Guice 4.x, che comprendeva la risposta di Tim così:

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; 
    } 
} 

Naturalmente si è liberi di generare qualsiasi altra Nome file :)

+0

Jeff, non so se hai visto la risposta di @ Tim ma è necessaria per l'ultima versione di graphviz e Guice 3.0. Non l'ho provato con 4.0 beta ancora. – durron597

+0

@ durron597 aggiornato, grazie. –

2

Quando si utilizza il più versione recente di GraphViz, trovo che la seguente sostituzione aiuta anche (altrimenti GraphViz si rifiuta di aprire il file):

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

Guice 4.x esempio incorporando Jeff e Tim di 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

Piccola correzione di bug - nella versione corrente di guice-grapher che sto usando (4.0-beta), la parola chiave 'margin' non ha uno spazio davanti, quindi la linea di sostituzione dovrebbe essere: s = s .replaceAll ("margin = (\\ S +),", "margin = \" $ 1 \ ","); Altrimenti, grazie mille per il campione. – chooks

-1

Il primo replaceAll nei hideClassPaths() metodo sopra è troppo zelanti - rimuove il nome della classe, così come il pacchetto. Dovrebbe essere

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

Nota l'aggiunta del segno di dollaro, quindi questo funziona anche per i nomi di classe interni.

+1

Grazie! Si prega di cancellare questa risposta e commentare o modificare la risposta errata. –

+0

@JeffAxelrod Ho copiato il codice nella tua risposta –

Problemi correlati