Guiceグラファユーティリティにbugがあり、ほとんどまたはすべてのグラフが壊れて表示されます。これに対応する方法がありますか?Guice Grapherを動作させる方法はありますか?
答えて
@ wuppiの答えを少し変更して、クラスパスと長いランダムな名前の注釈も隠して、グラフをはるかにコンパクトかつ読みやすくしました。編集したコードのanswerは、次のようになります。
このユーティリティメソッドは非常に便利で、私にとって間違ったグラフをpritnedしませんでした。
についてstyle=invis
バグについて:Guiceグラフェラプラグインはドットファイルを生成します。ドットファイルは、いくつかのクリスタルを不可視としてスタイルします。下に掲載されている方法のreplaceAll()
はそれを回避します。コードの残りの部分は、Guiceの例とほぼ同じです。
私もティムの答えを含まGuiceの4.xでは、のためのスコットの修正が組み込まれました:もちろん
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;
}
}
あなたが他のファイル名を生成するのは自由です:)
ほとんどを使用している場合GraphVizをの最新バージョン、私は次の置換にも役立つことを見つける(それ以外のGraphVizを、ファイルを開くことを拒否):
s.replaceAll(" margin=(\\S+), ", " margin=\"$1\", ")
のGuiceはジェフとティムのsolutioを組み込む例を4.xの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;
}
}
小さなバグ修正 - 私が使用しているguice-grapherの現在のバージョン(4.0-beta)では、 'margin'キーワードの前に空白がないため、置換行は次のようになります。s = s .replaceAll( "margin =(\\ S +)"、 "margin = \" $ 1 \ "、");それ以外の場合は、サンプルをいただきありがとうございます。 – chooks
上記のhideClassPaths()メソッドの最初のreplaceAllはzealousです。これはクラス名とパッケージを削除します。
ドル記号を追加することに注意してください。これは内部クラス名にも有効です。
ありがとう!この回答を削除して、誤った回答にコメントしたり編集したりしてください。 –
@JeffAxelrod答えにコードをコピーしました。 –
ジェフ、あなたが@ティムの答えを見たかどうかわかりませんが、graphvizとGuice 3.0の最新バージョンには必要です。私はまだ4.0ベータ版でそれを試していない。 – durron597
@ durron597が更新されました。ありがとうございます。 –