[76] | 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()); |
---|
[90] | 98 | vstupProcesu.print(zdroják); |
---|
[76] | 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 | } |
---|
[87] | 120 | |
---|