1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 18:00:41 2012 +0200
1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 19:22:21 2012 +0200
1.3 @@ -18,12 +18,16 @@
1.4 package cz.frantovo.xmlWebGenerator.makra;
1.5
1.6 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
1.7 +import java.io.ByteArrayInputStream;
1.8 import java.io.File;
1.9 import java.io.PrintStream;
1.10 import java.net.URI;
1.11 import java.util.Collections;
1.12 import java.util.HashMap;
1.13 import java.util.Map;
1.14 +import javax.xml.parsers.DocumentBuilder;
1.15 +import javax.xml.parsers.DocumentBuilderFactory;
1.16 +import org.w3c.dom.Document;
1.17
1.18 /**
1.19 * Provedeme skript a do stránky vložíme jeho výstup.
1.20 @@ -53,12 +57,13 @@
1.21 *
1.22 * @param skript program k vykonání
1.23 * @param jazyk programovací jazyk
1.24 + * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
1.25 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
1.26 * @param nadpisStránky nadpis stránky → proměnná prostředí
1.27 * @param perexStránky perex stránky → proměnná prostředí
1.28 * @return výstup příkazu
1.29 */
1.30 - public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) {
1.31 + public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
1.32 try {
1.33 System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
1.34 String interpret = interpreti.get(jazyk);
1.35 @@ -76,19 +81,20 @@
1.36 ps.print(skript);
1.37 ps.close();
1.38
1.39 - f.setExecutable(true);
1.40
1.41 String[] prostředí = new String[]{
1.42 "LANG=" + System.getenv("LANG"),
1.43 "USER=" + System.getenv("USER"),
1.44 - "XWG_STRANKA_URI=" + uriStránky,
1.45 - "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()),
1.46 - "XWG_STRANKA_NADPIS=" + nadpisStránky,
1.47 - "XWG_STRANKA_PEREX=" + perexStránky
1.48 + "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java",
1.49 + "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky
1.50 + "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru
1.51 + "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky
1.52 + "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky
1.53 };
1.54
1.55
1.56
1.57 + f.setExecutable(true);
1.58 Runtime r = Runtime.getRuntime();
1.59 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
1.60
1.61 @@ -97,19 +103,15 @@
1.62
1.63 p.waitFor();
1.64
1.65 - /**
1.66 - * TODO: podporovat zvláštní návratový kód, kterým skript řekne,
1.67 - * že výstupem je XML a má se vložit jako fragment do dokumentu,
1.68 - * ne jako prostý text.
1.69 - */
1.70 if (p.exitValue() == 0) {
1.71 if (chyby.length() > 0) {
1.72 - System.err.println("--- Cyhbový výstup skriptu -----");
1.73 + System.err.println("--- Chybový výstup skriptu -----");
1.74 System.err.println(chyby);
1.75 System.err.println("--------------------------------");
1.76 + System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
1.77 }
1.78
1.79 - return výsledek.trim();
1.80 + return připravVýstup(výsledek, výstupníFormát);
1.81 } else {
1.82 System.err.println("--- Standardní výstup skriptu: -----");
1.83 System.err.println(výsledek);
1.84 @@ -128,4 +130,35 @@
1.85 return null;
1.86 }
1.87 }
1.88 +
1.89 + private static String připravVýstup(String výsledek, String formát) {
1.90 + if ("xml".equals(formát)) {
1.91 + if (zkontrolujXml(výsledek)) {
1.92 + return výsledek.trim();
1.93 + } else {
1.94 + System.err.println("Chyba v XML generovaném skriptem:");
1.95 + System.err.println(výsledek);
1.96 + return null;
1.97 + }
1.98 + } else {
1.99 + return výsledek.trim();
1.100 + }
1.101 + }
1.102 +
1.103 + /**
1.104 + * @param xml fragment XML vygenerovaný skriptem
1.105 + * @return true v případě, že výstup je validním fragmentem XML
1.106 + */
1.107 + private static boolean zkontrolujXml(String xml) {
1.108 + try {
1.109 + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1.110 + DocumentBuilder db = dbf.newDocumentBuilder();
1.111 + xml = "<xml>" + xml + "</xml>";
1.112 + Document d = db.parse(new ByteArrayInputStream(xml.getBytes()));
1.113 + return true;
1.114 + } catch (Exception e) {
1.115 + e.printStackTrace(System.err);
1.116 + return false;
1.117 + }
1.118 + }
1.119 }