W narzędziu graphera Guice jest bug, który powoduje, że większość lub wszystkie wykresy są renderowane jako uszkodzone. Czy istnieje obejście lub naprawa tego problemu?Czy jest jakiś sposób, aby Guice Grapher zadziałał?
Odpowiedz
Zmodyfiowałem nieznacznie odpowiedź @ wuppi, aby ukryć ścieżki klas i długie losowe adnotacje, aby wykres był bardziej zwarty i czytelny. Jego answer z edytowanym kodem:
Uważam, że ta metoda użyteczności jest bardzo przydatna i nigdy nie wyśmiewała dla mnie nieprawidłowych wykresów.
Odnośnie błędu style=invis
: Wtyczka graphera Guice generuje plik dot, który określa niektóre z nich jako niewidoczne. W poniższej metodzie znajduje się metoda replaceAll()
. Reszta kodu jest prawie taka sama z przykładu Guice.
mam włączone poprawkę Scot za Guice 4.x, który zawierał odpowiedź Tima także:
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;
}
}
Oczywiście, że jesteś wolny, aby wygenerować dowolny inny Infomacje :)
Przy zastosowaniu najbardziej Najnowsza wersja Graphviz uważam, że następujące podstawienie pomaga również (inaczej GraphViz odmówi otwarcia pliku):
s.replaceAll(" margin=(\\S+), ", " margin=\"$1\", ")
Guice 4.x przykład zawierający Jeff i Tima 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;
}
}
Małe poprawki błędów - w obecnej wersji guice-grapher, której używam (4.0-beta), słowo kluczowe "margin" nie ma spacji przed nim, więc linia zastępująca powinna być: s = s .replaceAll ("margin = (\\ S +)", "margin = \" $ 1 \ ","); W przeciwnym razie, bardzo dziękuję za próbkę. – chooks
Pierwszy replaceAll w hideClassPaths Powyższy sposób() jest większy niż gorliwe - usuwa się z nazwy klasy jak i opakowanie. Powinno być Zwróć uwagę na dodanie znaku dolara, więc działa to również w przypadku nazw klas wewnętrznych.
Dzięki! Usuń tę odpowiedź i skomentuj lub edytuj niepoprawną odpowiedź. –
@JeffAxelrod Skopiowałem kod do twojej odpowiedzi –
Jeff, nie wiem, czy widziałeś odpowiedź Tima, ale jest ona potrzebna w najnowszej wersji grafviz i Guice 3.0. Nie próbowałem jeszcze wersji 4.0 beta. – durron597
@ durron597 zaktualizowany, dzięki. –