šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
changeset 107 379a2a893fd1
parent 103 aa91d1c6d4c1
child 108 8d9cab64c335
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Thu Jul 05 14:27:01 2012 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Thu Jul 05 19:10:42 2012 +0200
@@ -18,6 +18,7 @@
 package cz.frantovo.xmlWebGenerator.makra;
 
 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
+import static cz.frantovo.xmlWebGenerator.Xmlns.*;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.PrintStream;
@@ -27,7 +28,10 @@
 import java.util.Map;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 /**
  * Provedeme skript a do stránky vložíme jeho výstup.
@@ -62,9 +66,15 @@
 	 * @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
+	 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource)
 	 */
-	public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
+	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 {
+		String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
+		return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát));
+	}
+
+	private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
+
 		try {
 			if (isNeprázdný(skriptSoubor)) {
 				System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
@@ -136,7 +146,7 @@
 					System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
 				}
 
-				return připravVýstup(výsledek, výstupníFormát);
+				return výsledek.trim();
 			} else {
 				System.err.println("--- Standardní výstup skriptu: -----");
 				System.err.println(výsledek);
@@ -146,26 +156,12 @@
 				throw new Exception("Návratová hodnota: " + p.exitValue());
 			}
 		} catch (Exception e) {
-			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
+			System.err.println("Došlo k chybě při vykonávání skriptu.");
 			System.err.println("--------");
 			System.err.println(skriptText);
 			System.err.println("--------");
 			e.printStackTrace(System.err);
-			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();
+			throw e;
 		}
 	}
 
@@ -174,19 +170,34 @@
 	}
 
 	/**
-	 * @param xml fragment XML vygenerovaný skriptem
-	 * @return true v případě, že výstup je validním fragmentem XML
+	 * @param zadání výstup vygenerovaný skriptem
+	 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text
+	 * @return xml fragment nebo prostý text zabalený do html/body
+	 * @throws Exception
 	 */
-	private static boolean zkontrolujXml(String xml) {
-		try {
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-			xml = "<xml>" + xml + "</xml>";
-			Document d = db.parse(new ByteArrayInputStream(xml.getBytes()));
-			return true;
-		} catch (Exception e) {
-			e.printStackTrace(System.err);
-			return false;
+	private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception {
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		DocumentBuilder db = dbf.newDocumentBuilder();
+		Document d;
+
+		if (xmlFormát) {
+			try {
+				zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
+				d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
+			} catch (Exception e) {
+				System.err.println("Chyba: Skript vrátil neplatné XML.");
+				throw e;
+			}
+		} else {
+			d = db.newDocument();
+			Node html = d.createElementNS(XHTML, "html");
+			Node body = d.createElementNS(XHTML, "body");
+			Node text = d.createTextNode(zadání);
+			body.appendChild(text);
+			html.appendChild(body);
+			d.appendChild(html);
 		}
+
+		return new DOMSource(d);
 	}
 }