šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
changeset 107 379a2a893fd1
parent 103 aa91d1c6d4c1
child 108 8d9cab64c335
equal deleted inserted replaced
106:ae484a54d7fb 107:379a2a893fd1
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17  */
    17  */
    18 package cz.frantovo.xmlWebGenerator.makra;
    18 package cz.frantovo.xmlWebGenerator.makra;
    19 
    19 
    20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
    20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
       
    21 import static cz.frantovo.xmlWebGenerator.Xmlns.*;
    21 import java.io.ByteArrayInputStream;
    22 import java.io.ByteArrayInputStream;
    22 import java.io.File;
    23 import java.io.File;
    23 import java.io.PrintStream;
    24 import java.io.PrintStream;
    24 import java.net.URI;
    25 import java.net.URI;
    25 import java.util.Collections;
    26 import java.util.Collections;
    26 import java.util.HashMap;
    27 import java.util.HashMap;
    27 import java.util.Map;
    28 import java.util.Map;
    28 import javax.xml.parsers.DocumentBuilder;
    29 import javax.xml.parsers.DocumentBuilder;
    29 import javax.xml.parsers.DocumentBuilderFactory;
    30 import javax.xml.parsers.DocumentBuilderFactory;
       
    31 import javax.xml.transform.Source;
       
    32 import javax.xml.transform.dom.DOMSource;
    30 import org.w3c.dom.Document;
    33 import org.w3c.dom.Document;
       
    34 import org.w3c.dom.Node;
    31 
    35 
    32 /**
    36 /**
    33  * Provedeme skript a do stránky vložíme jeho výstup.
    37  * Provedeme skript a do stránky vložíme jeho výstup.
    34  *
    38  *
    35  * @author František Kučera (frantovo.cz)
    39  * @author František Kučera (frantovo.cz)
    60 	 * @param jazyk programovací jazyk
    64 	 * @param jazyk programovací jazyk
    61 	 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
    65 	 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu)
    62 	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    66 	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    63 	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    67 	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    64 	 * @param perexStránky perex stránky → proměnná prostředí
    68 	 * @param perexStránky perex stránky → proměnná prostředí
    65 	 * @return výstup příkazu
    69 	 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource)
    66 	 */
    70 	 */
    67 	public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) {
    71 	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 {
       
    72 		String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
       
    73 		return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát));
       
    74 	}
       
    75 
       
    76 	private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
       
    77 
    68 		try {
    78 		try {
    69 			if (isNeprázdný(skriptSoubor)) {
    79 			if (isNeprázdný(skriptSoubor)) {
    70 				System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
    80 				System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor);
    71 			} else {
    81 			} else {
    72 				System.err.println("\tInterpretuji skript v jazyce:   " + jazyk);
    82 				System.err.println("\tInterpretuji skript v jazyce:   " + jazyk);
   134 					System.err.println(chyby);
   144 					System.err.println(chyby);
   135 					System.err.println("--------------------------------");
   145 					System.err.println("--------------------------------");
   136 					System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
   146 					System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál.");
   137 				}
   147 				}
   138 
   148 
   139 				return připravVýstup(výsledek, výstupníFormát);
   149 				return výsledek.trim();
   140 			} else {
   150 			} else {
   141 				System.err.println("--- Standardní výstup skriptu: -----");
   151 				System.err.println("--- Standardní výstup skriptu: -----");
   142 				System.err.println(výsledek);
   152 				System.err.println(výsledek);
   143 				System.err.println("--- Cyhbový výstup skriptu: ---------");
   153 				System.err.println("--- Cyhbový výstup skriptu: ---------");
   144 				System.err.println(chyby);
   154 				System.err.println(chyby);
   145 				System.err.println("--------------------------------------");
   155 				System.err.println("--------------------------------------");
   146 				throw new Exception("Návratová hodnota: " + p.exitValue());
   156 				throw new Exception("Návratová hodnota: " + p.exitValue());
   147 			}
   157 			}
   148 		} catch (Exception e) {
   158 		} catch (Exception e) {
   149 			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
   159 			System.err.println("Došlo k chybě při vykonávání skriptu.");
   150 			System.err.println("--------");
   160 			System.err.println("--------");
   151 			System.err.println(skriptText);
   161 			System.err.println(skriptText);
   152 			System.err.println("--------");
   162 			System.err.println("--------");
   153 			e.printStackTrace(System.err);
   163 			e.printStackTrace(System.err);
   154 			return null;
   164 			throw e;
   155 		}
       
   156 	}
       
   157 
       
   158 	private static String připravVýstup(String výsledek, String formát) {
       
   159 		if ("xml".equals(formát)) {
       
   160 			if (zkontrolujXml(výsledek)) {
       
   161 				return výsledek.trim();
       
   162 			} else {
       
   163 				System.err.println("Chyba v XML generovaném skriptem:");
       
   164 				System.err.println(výsledek);
       
   165 				return null;
       
   166 			}
       
   167 		} else {
       
   168 			return výsledek.trim();
       
   169 		}
   165 		}
   170 	}
   166 	}
   171 
   167 
   172 	private static boolean isNeprázdný(String s) {
   168 	private static boolean isNeprázdný(String s) {
   173 		return !(s == null || s.trim().isEmpty());
   169 		return !(s == null || s.trim().isEmpty());
   174 	}
   170 	}
   175 
   171 
   176 	/**
   172 	/**
   177 	 * @param xml fragment XML vygenerovaný skriptem
   173 	 * @param zadání výstup vygenerovaný skriptem
   178 	 * @return true v případě, že výstup je validním fragmentem XML
   174 	 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text
       
   175 	 * @return xml fragment nebo prostý text zabalený do html/body
       
   176 	 * @throws Exception
   179 	 */
   177 	 */
   180 	private static boolean zkontrolujXml(String xml) {
   178 	private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception {
   181 		try {
   179 		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   182 			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   180 		DocumentBuilder db = dbf.newDocumentBuilder();
   183 			DocumentBuilder db = dbf.newDocumentBuilder();
   181 		Document d;
   184 			xml = "<xml>" + xml + "</xml>";
   182 
   185 			Document d = db.parse(new ByteArrayInputStream(xml.getBytes()));
   183 		if (xmlFormát) {
   186 			return true;
   184 			try {
   187 		} catch (Exception e) {
   185 				zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
   188 			e.printStackTrace(System.err);
   186 				d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
   189 			return false;
   187 			} catch (Exception e) {
       
   188 				System.err.println("Chyba: Skript vrátil neplatné XML.");
       
   189 				throw e;
       
   190 			}
       
   191 		} else {
       
   192 			d = db.newDocument();
       
   193 			Node html = d.createElementNS(XHTML, "html");
       
   194 			Node body = d.createElementNS(XHTML, "body");
       
   195 			Node text = d.createTextNode(zadání);
       
   196 			body.appendChild(text);
       
   197 			html.appendChild(body);
       
   198 			d.appendChild(html);
   190 		}
   199 		}
       
   200 
       
   201 		return new DOMSource(d);
   191 	}
   202 	}
   192 }
   203 }