2012-02-15 30 views

उत्तर

16

मैंने ग्राफ को और अधिक कॉम्पैक्ट और पठनीय बनाने के लिए कक्षा पथ और लंबे यादृच्छिक नाम एनोटेशन को छिपाने के लिए @ wuppi के उत्तर को थोड़ा सा संशोधित किया। संपादित कोड के साथ उनका answer निम्न है:

मुझे यह उपयोगिता विधि बहुत उपयोगी लगता है और यह मेरे लिए गलत ग्राफ कभी नहीं छेड़छाड़ करता है।

style=invis बग के बारे में: गुइस ग्रैपर प्लगइन एक डॉट फ़ाइल उत्पन्न करता है, जो कुछ क्लॉज को अदृश्य के रूप में शैलियों बनाता है। नीचे पोस्ट विधि में replaceAll() उस के आसपास काम करता है। बाकी कोड गुइस उदाहरण से लगभग समान है।

मैं 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

जेफ, मुझे नहीं पता कि आपने @ टिम का जवाब देखा है, लेकिन ग्राफविज़ और गुइस 3.0 के नवीनतम संस्करण के लिए इसकी आवश्यकता है। मैंने अभी तक 4.0 बीटा के साथ कोशिश नहीं की है। – durron597

+0

@ durron597 अपडेट किया गया, धन्यवाद। –

2

उत्पन्न करने के लिए स्वतंत्र हैं Graphviz के हाल के संस्करण, मुझे लगता है कि निम्नलिखित प्रतिस्थापन भी मदद करता है (अन्यथा Graphviz फ़ाइल को खोलने के लिए मना कर दिया):

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

Guice उदाहरण जेफ और टिम solutio शामिल 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_]*)", ""); 
     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

छोटे बग फिक्स - गिसिस-ग्रैफर के वर्तमान संस्करण में जो मैं उपयोग कर रहा हूं (4.0-बीटा), 'मार्जिन' कीवर्ड में इसके सामने कोई स्थान नहीं है, इसलिए प्रतिस्थापन रेखा होना चाहिए: s = s .replaceAll ("मार्जिन = (\\ एस +),", "मार्जिन = \" $ 1 \ ","); अन्यथा, नमूना के लिए बहुत बहुत धन्यवाद। – chooks

-1

hideClassPaths() विधि से ऊपर उत्साही खत्म हो गया है में पहली replaceAll - यह वर्ग के नाम के साथ ही पैकेज निकाल देता है। यह

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

डॉलर-चिह्न के अतिरिक्त ध्यान दें ताकि यह आंतरिक कक्षा के नामों के लिए भी काम करे।

+1

धन्यवाद! कृपया इस उत्तर को हटाएं और या तो गलत उत्तर पर टिप्पणी करें या संपादित करें। –

+0

@ जेफएक्सेलोड मैंने कोड को आपके उत्तर में कॉपी किया –

संबंधित मुद्दे