diff -r 4b3ba32f613c -r 6181a00e0ffd šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 18:00:41 2012 +0200 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 20:39:15 2012 +0200 @@ -18,12 +18,16 @@ package cz.frantovo.xmlWebGenerator.makra; import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.PrintStream; import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.w3c.dom.Document; /** * Provedeme skript a do stránky vložíme jeho výstup. @@ -53,12 +57,13 @@ * * @param skript program k vykonání * @param jazyk programovací jazyk + * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) * @param uriStránky URI aktuálně generované stránky → proměnná prostředí * @param nadpisStránky nadpis stránky → proměnná prostředí * @param perexStránky perex stránky → proměnná prostředí * @return výstup příkazu */ - public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) { + public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { try { System.err.println("\tInterpretuji skript v jazyce: " + jazyk); String interpret = interpreti.get(jazyk); @@ -76,19 +81,20 @@ ps.print(skript); ps.close(); - f.setExecutable(true); String[] prostředí = new String[]{ "LANG=" + System.getenv("LANG"), "USER=" + System.getenv("USER"), - "XWG_STRANKA_URI=" + uriStránky, - "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), - "XWG_STRANKA_NADPIS=" + nadpisStránky, - "XWG_STRANKA_PEREX=" + perexStránky + "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", + "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky + "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru + "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky + "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky }; + f.setExecutable(true); Runtime r = Runtime.getRuntime(); Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); @@ -97,19 +103,15 @@ p.waitFor(); - /** - * TODO: podporovat zvláštní návratový kód, kterým skript řekne, - * že výstupem je XML a má se vložit jako fragment do dokumentu, - * ne jako prostý text. - */ if (p.exitValue() == 0) { if (chyby.length() > 0) { - System.err.println("--- Cyhbový výstup skriptu -----"); + System.err.println("--- Chybový výstup skriptu -----"); System.err.println(chyby); System.err.println("--------------------------------"); + System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); } - return výsledek.trim(); + return připravVýstup(výsledek, výstupníFormát); } else { System.err.println("--- Standardní výstup skriptu: -----"); System.err.println(výsledek); @@ -128,4 +130,35 @@ return null; } } + + private static String připravVýstup(String výsledek, String formát) { + if ("xml".equals(formát)) { + if (zkontrolujXml(výsledek)) { + return výsledek.trim(); + } else { + System.err.println("Chyba v XML generovaném skriptem:"); + System.err.println(výsledek); + return null; + } + } else { + return výsledek.trim(); + } + } + + /** + * @param xml fragment XML vygenerovaný skriptem + * @return true v případě, že výstup je validním fragmentem XML + */ + private static boolean zkontrolujXml(String xml) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + xml = "" + xml + ""; + Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); + return true; + } catch (Exception e) { + e.printStackTrace(System.err); + return false; + } + } }