|
1 /** |
|
2 * XML Web generátor – program na generování webových stránek |
|
3 * Copyright © 2012 František Kučera (frantovo.cz) |
|
4 * |
|
5 * This program is free software: you can redistribute it and/or modify |
|
6 * it under the terms of the GNU General Public License as published by |
|
7 * the Free Software Foundation, either version 3 of the License, or |
|
8 * (at your option) any later version. |
|
9 * |
|
10 * This program is distributed in the hope that it will be useful, |
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 * GNU General Public License for more details. |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License |
|
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
17 */ |
|
18 package cz.frantovo.xmlWebGenerator.makra; |
|
19 |
|
20 import java.io.File; |
|
21 import java.io.IOException; |
|
22 import java.io.PrintStream; |
|
23 import java.net.URLDecoder; |
|
24 import java.nio.charset.Charset; |
|
25 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.*; |
|
26 |
|
27 /** |
|
28 * Diagramy |
|
29 * |
|
30 * @author František Kučera (frantovo.cz) |
|
31 */ |
|
32 public class Diagram { |
|
33 |
|
34 private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup"; |
|
35 private static final String PŘÍKAZ_DOT = "dot"; |
|
36 private static int počítadloDiagramů = 0; |
|
37 private static String počítadloDiagramůKontext = ""; // aktuálně zpracovávaná stránka, při změně vynulujeme počítadlo |
|
38 |
|
39 /** |
|
40 * Vytvoří obrázek s diagramem. |
|
41 * @param zadání definice diagramu ve formátu dot |
|
42 * @param vodorovně zda má být graf orientovaný vodorovně (funguje jen při <code>kompletní = false</code>) |
|
43 * @param kompletní false, pokud k zadání chceme doplnit <code>digraph d {…}</code> |
|
44 * @param kontext kam diagram patří – typicky název stránky, do které je vložen |
|
45 * diagramy se pak budou číslovat v rámci tohoto kontextu |
|
46 * → nebude docházet k přepisování diagramů jiných stránek při částečném přegenerování webu. |
|
47 * @param souborZadání null pokud chceme automatické číslování | nebo zadáme název souboru se zadáním diagramu – vygenerovaný diagram se pak bude jmenovat stejně |
|
48 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě. |
|
49 */ |
|
50 public static String vytvořDiagram(String zadání, boolean vodorovně, boolean kompletní, String kontext, String souborZadání) throws IOException, InterruptedException { |
|
51 if (isPříkazDostupný(PŘÍKAZ_DOT)) { |
|
52 |
|
53 String soubor; |
|
54 if (souborZadání == null) { |
|
55 if (kontext == null) { |
|
56 počítadloDiagramů++; |
|
57 soubor = "diagram-" + počítadloDiagramů; |
|
58 } else { |
|
59 // TODO: tohle by se mělo udělat v XSLT |
|
60 kontext = URLDecoder.decode(kontext, Charset.defaultCharset().name()); |
|
61 |
|
62 // Každá stránka bude mít svoje diagramy číslované od 1 |
|
63 if (!počítadloDiagramůKontext.equals(kontext)) { |
|
64 počítadloDiagramůKontext = kontext; |
|
65 počítadloDiagramů = 0; |
|
66 } |
|
67 |
|
68 počítadloDiagramů++; |
|
69 soubor = "diagram-" + kontext + "-" + počítadloDiagramů; |
|
70 } |
|
71 } else { |
|
72 soubor = souborZadání; |
|
73 } |
|
74 String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor; |
|
75 |
|
76 String zdroják; |
|
77 if (kompletní) { |
|
78 zdroják = zadání; |
|
79 } else { |
|
80 StringBuilder b = new StringBuilder(zadání.length() + 200); |
|
81 b.append("digraph d {\n"); |
|
82 b.append("\tbgcolor=\"transparent\";\n"); |
|
83 if (vodorovně) { |
|
84 b.append("\trankdir=LR;"); |
|
85 } |
|
86 b.append(zadání); |
|
87 b.append("}\n"); |
|
88 zdroják = b.toString(); |
|
89 } |
|
90 |
|
91 Runtime r = Runtime.getRuntime(); |
|
92 Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"}); |
|
93 |
|
94 /** |
|
95 * TODO: generovat i PNG bitmapu |
|
96 */ |
|
97 PrintStream vstupProcesu = new PrintStream(p.getOutputStream()); |
|
98 vstupProcesu.print(zdroják.toString()); |
|
99 vstupProcesu.close(); |
|
100 |
|
101 String chyby = načtiProud(p.getErrorStream()); |
|
102 |
|
103 p.waitFor(); |
|
104 |
|
105 if (chyby.length() == 0) { |
|
106 return soubor; |
|
107 } else { |
|
108 System.err.print("Při vytváření diagramu došlo k chybě: " + chyby); |
|
109 return null; |
|
110 } |
|
111 } else { |
|
112 System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit."); |
|
113 System.err.println("Můžete ho nainstalovat pomocí:"); |
|
114 System.err.println("\t$ aptitude install graphviz # (Debian/Ubuntu)"); |
|
115 System.err.println("\t$ yum install graphviz # (Fedora/RedHat)"); |
|
116 return null; |
|
117 } |
|
118 } |
|
119 } |