--- 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);
}
}