Есть ли способ заставить работать Guice Grapher? - PullRequest
9 голосов
/ 16 февраля 2012

В утилите графического редактора Guice есть ошибка , из-за которой большинство или все графики оказываются поврежденными.Есть ли обходной путь или исправление для этого?

Ответы [ 4 ]

16 голосов
/ 16 февраля 2012

Я немного изменил ответ @ wuppi, чтобы также скрыть пути классов и длинные аннотации случайных имен, чтобы сделать график намного более компактным и читаемым. Его ответ с отредактированным кодом следует:

Я считаю этот метод довольно полезным, и он никогда не печатал неправильные графики для меня.

Относительно ошибки style=invis: плагин Guice grapher генерирует точечный файл, который стилизует некоторые фразы как невидимые. 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;
    }
}

Конечно, вы можете создать любое другое имя файла:)

5 голосов
/ 26 декабря 2013

Пример 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_]*)", "");
        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;
    }
}
2 голосов
/ 05 апреля 2013

При использовании самой последней версии GraphViz, я считаю, что также помогает следующая подстановка (в противном случае GraphViz отказывается открывать файл):

s.replaceAll(" margin=(\\S+), ", " margin=\"$1\", ")
0 голосов
/ 18 февраля 2014

Первый метод replaceAll в приведенном выше методе hideClassPaths () чрезмерно усердствует - он удаляет имя класса, а также пакет.Это должно быть

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

Обратите внимание на добавление знака доллара, так что это также работает для внутренних имен классов.

...