C'è un bug nell'utilità Grapher Guice che causa la maggior parte o tutti i grafici per il rendering danneggiato. C'è una soluzione o una soluzione per questo?C'è qualche modo per far lavorare Guice Grapher?
risposta
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 :)
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\", ")
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;
}
}
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
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.
Grazie! Si prega di cancellare questa risposta e commentare o modificare la risposta errata. –
@JeffAxelrod Ho copiato il codice nella tua risposta –
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
@ durron597 aggiornato, grazie. –