2012-02-15 4 views

答えて

16

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

あなたが他のファイル名を生成するのは自由です:)

+0

ジェフ、あなたが@ティムの答えを見たかどうかわかりませんが、graphvizとGuice 3.0の最新バージョンには必要です。私はまだ4.0ベータ版でそれを試していない。 – durron597

+0

@ durron597が更新されました。ありがとうございます。 –

2

ほとんどを使用している場合GraphVizをの最新バージョン、私は次の置換にも役立つことを見つける(それ以外のGraphVizを、ファイルを開くことを拒否):

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

の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; 
    } 
} 
+1

小さなバグ修正 - 私が使用しているguice-grapherの現在のバージョン(4.0-beta)では、 'margin'キーワードの前に空白がないため、置換行は次のようになります。s = s .replaceAll( "margin =(\\ S +)"、 "margin = \" $ 1 \ "、");それ以外の場合は、サンプルをいただきありがとうございます。 – chooks

-1

上記のhideClassPaths()メソッドの最初のreplaceAllはzealousです。これはクラス名とパッケージを削除します。

ドル記号を追加することに注意してください。これは内部クラス名にも有効です。

+1

ありがとう!この回答を削除して、誤った回答にコメントしたり編集したりしてください。 –

+0

@JeffAxelrod答えにコードをコピーしました。 –