1.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 14:27:01 2012 +0200
1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 19:10:42 2012 +0200
1.3 @@ -18,6 +18,7 @@
1.4 package cz.frantovo.xmlWebGenerator.makra;
1.5
1.6 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
1.7 +import static cz.frantovo.xmlWebGenerator.Xmlns.*;
1.8 import java.io.ByteArrayInputStream;
1.9 import java.io.File;
1.10 import java.io.PrintStream;
1.11 @@ -27,7 +28,10 @@
1.12 import java.util.Map;
1.13 import javax.xml.parsers.DocumentBuilder;
1.14 import javax.xml.parsers.DocumentBuilderFactory;
1.15 +import javax.xml.transform.Source;
1.16 +import javax.xml.transform.dom.DOMSource;
1.17 import org.w3c.dom.Document;
1.18 +import org.w3c.dom.Node;
1.19
1.20 /**
1.21 * Provedeme skript a do stránky vložíme jeho výstup.
1.22 @@ -62,9 +66,15 @@
1.23 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
1.24 * @param nadpisStránky nadpis stránky → proměnná prostředí
1.25 * @param perexStránky perex stránky → proměnná prostředí
1.26 - * @return výstup příkazu
1.27 + * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource)
1.28 */
1.29 - public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
1.30 + public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
1.31 + String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
1.32 + return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát));
1.33 + }
1.34 +
1.35 + private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
1.36 +
1.37 try {
1.38 if (isNeprázdný(skriptSoubor)) {
1.39 System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
1.40 @@ -136,7 +146,7 @@
1.41 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
1.42 }
1.43
1.44 - return připravVýstup(výsledek, výstupníFormát);
1.45 + return výsledek.trim();
1.46 } else {
1.47 System.err.println("--- Standardní výstup skriptu: -----");
1.48 System.err.println(výsledek);
1.49 @@ -146,26 +156,12 @@
1.50 throw new Exception("Návratová hodnota: " + p.exitValue());
1.51 }
1.52 } catch (Exception e) {
1.53 - System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
1.54 + System.err.println("Došlo k chybě při vykonávání skriptu.");
1.55 System.err.println("--------");
1.56 System.err.println(skriptText);
1.57 System.err.println("--------");
1.58 e.printStackTrace(System.err);
1.59 - return null;
1.60 - }
1.61 - }
1.62 -
1.63 - private static String připravVýstup(String výsledek, String formát) {
1.64 - if ("xml".equals(formát)) {
1.65 - if (zkontrolujXml(výsledek)) {
1.66 - return výsledek.trim();
1.67 - } else {
1.68 - System.err.println("Chyba v XML generovaném skriptem:");
1.69 - System.err.println(výsledek);
1.70 - return null;
1.71 - }
1.72 - } else {
1.73 - return výsledek.trim();
1.74 + throw e;
1.75 }
1.76 }
1.77
1.78 @@ -174,19 +170,34 @@
1.79 }
1.80
1.81 /**
1.82 - * @param xml fragment XML vygenerovaný skriptem
1.83 - * @return true v případě, že výstup je validním fragmentem XML
1.84 + * @param zadání výstup vygenerovaný skriptem
1.85 + * @param xmlFormát formát zadání: true = xml fragment | false = prostý text
1.86 + * @return xml fragment nebo prostý text zabalený do html/body
1.87 + * @throws Exception
1.88 */
1.89 - private static boolean zkontrolujXml(String xml) {
1.90 - try {
1.91 - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1.92 - DocumentBuilder db = dbf.newDocumentBuilder();
1.93 - xml = "<xml>" + xml + "</xml>";
1.94 - Document d = db.parse(new ByteArrayInputStream(xml.getBytes()));
1.95 - return true;
1.96 - } catch (Exception e) {
1.97 - e.printStackTrace(System.err);
1.98 - return false;
1.99 + private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception {
1.100 + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1.101 + DocumentBuilder db = dbf.newDocumentBuilder();
1.102 + Document d;
1.103 +
1.104 + if (xmlFormát) {
1.105 + try {
1.106 + zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
1.107 + d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
1.108 + } catch (Exception e) {
1.109 + System.err.println("Chyba: Skript vrátil neplatné XML.");
1.110 + throw e;
1.111 + }
1.112 + } else {
1.113 + d = db.newDocument();
1.114 + Node html = d.createElementNS(XHTML, "html");
1.115 + Node body = d.createElementNS(XHTML, "body");
1.116 + Node text = d.createTextNode(zadání);
1.117 + body.appendChild(text);
1.118 + html.appendChild(body);
1.119 + d.appendChild(html);
1.120 }
1.121 +
1.122 + return new DOMSource(d);
1.123 }
1.124 }