šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
changeset 32 6bc25517ac4f
parent 31 da6ae32853cb
child 36 5be21d1ef5f8
equal deleted inserted replaced
31:da6ae32853cb 32:6bc25517ac4f
    11 import java.net.URISyntaxException;
    11 import java.net.URISyntaxException;
    12 
    12 
    13 /**
    13 /**
    14  * Knihovna funkcí volaných z XSLT.
    14  * Knihovna funkcí volaných z XSLT.
    15  *  
    15  *  
    16  * TODO: časem rozdělit na více modulů (jmenných prostorů).
    16  * TODO: 
       
    17  *	- rozdělit na více modulů (jmenných prostorů).
       
    18  *	- CLI konektor
    17  * 
    19  * 
    18  * @author fiki
    20  * @author fiki
    19  */
    21  */
    20 public class Funkce {
    22 public class Funkce {
    21 
    23 
    22 	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
    24 	private static final String PŘÍKAZ_PYGMENTIZE = "pygmentize";
       
    25 	private static final String PŘÍKAZ_DOT = "dot";
    23 	private static final String PŘÍKAZ_WHICH = "which";
    26 	private static final String PŘÍKAZ_WHICH = "which";
       
    27 	private static final String ADRESÁŘ_VÝSTUPNÍ = "výstup";
       
    28 	private static int počítadloDiagramů = 0;
    24 
    29 
    25 	/**
    30 	/**
    26 	 * Zjištuje, kdy byl naposledy daný soubor změněn.
    31 	 * Zjištuje, kdy byl naposledy daný soubor změněn.
    27 	 * @param soubor cesta k souboru
    32 	 * @param soubor cesta k souboru
    28 	 * @return datum poslední změny
    33 	 * @return datum poslední změny
    89 			return null;
    94 			return null;
    90 		}
    95 		}
    91 	}
    96 	}
    92 
    97 
    93 	/**
    98 	/**
       
    99 	 * Vytvoří obrázek s diagramem.
       
   100 	 * @param zadání definice diagramu ve formátu dot
       
   101 	 * @param vodorovně zda má být graf orientovaný vodorovně
       
   102 	 * @return název souboru bez přípony, který byl vytvořen, nebo null, pokud došlo k chybě.
       
   103 	 */
       
   104 	public static String vytvořDiagram(String zadání, boolean vodorovně) throws IOException, InterruptedException {
       
   105 		if (isPrikazDostupny(PŘÍKAZ_DOT)) {
       
   106 			počítadloDiagramů++;
       
   107 			String soubor = "diagram-" + počítadloDiagramů;
       
   108 			String souborSložka = ADRESÁŘ_VÝSTUPNÍ + File.separator + soubor;
       
   109 
       
   110 			StringBuilder zdroják = new StringBuilder(zadání.length() + 200);
       
   111 
       
   112 			zdroják.append("digraph d {\n");
       
   113 			zdroják.append("\tbgcolor=\"transparent\";\n");
       
   114 			if (vodorovně) {
       
   115 				zdroják.append("\trankdir=LR;");
       
   116 			}
       
   117 			zdroják.append(zadání);
       
   118 			zdroják.append("}\n");
       
   119 
       
   120 			Runtime r = Runtime.getRuntime();
       
   121 			Process p = r.exec(new String[]{PŘÍKAZ_DOT, "-T", "svg", "-o", souborSložka + ".svg"});
       
   122 
       
   123 			/**
       
   124 			 * TODO: generovat i PNG bitmapu
       
   125 			 */
       
   126 			PrintStream vstupProcesu = new PrintStream(p.getOutputStream());
       
   127 			vstupProcesu.print(zdroják.toString());
       
   128 			vstupProcesu.close();
       
   129 
       
   130 			String chyby = načtiProud(p.getErrorStream());
       
   131 
       
   132 			p.waitFor();
       
   133 
       
   134 			if (chyby.length() == 0) {
       
   135 				return soubor;
       
   136 			} else {
       
   137 				System.err.print("Při vytváření diagramu došlo k chybě: " + chyby);
       
   138 				return null;
       
   139 			}
       
   140 		} else {
       
   141 			System.err.println("Příkaz " + PŘÍKAZ_DOT + " není na vašem systému dostupný → diagramy nelze vygreslit.");
       
   142 			System.err.println("Můžete ho nainstalovat pomocí:");
       
   143 			System.err.println("\t$ aptitude install graphviz   # (Debian/Ubuntu)");
       
   144 			System.err.println("\t$ yum install graphviz        # (Fedora/RedHat)");
       
   145 			return null;
       
   146 		}
       
   147 	}
       
   148 
       
   149 	/**
    94 	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
   150 	 * Čte proud dat dokud to jde a výsledek pak vrátí jako text.
    95 	 * @param proud vstupní proud
   151 	 * @param proud vstupní proud
    96 	 * @return obsah proudu jako text
   152 	 * @return obsah proudu jako text
    97 	 * @throws IOException 
   153 	 * @throws IOException 
    98 	 */
   154 	 */