/** * XML Web generátor – program na generování webových stránek * Copyright © 2012 František Kučera (frantovo.cz) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ 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. * * @author František Kučera (frantovo.cz) */ public class Skriptování { /** * klíč = jazyk – např. bash * hodnota = interpret – např. /bin/bash */ private static final Map interpreti; static { Map podporovanýJazyk = new HashMap(); podporovanýJazyk.put("bash", "/bin/bash"); podporovanýJazyk.put("perl", "/usr/bin/perl"); podporovanýJazyk.put("php", "/usr/bin/php"); podporovanýJazyk.put("python", "/usr/bin/python"); interpreti = Collections.unmodifiableMap(podporovanýJazyk); } /** * TODO: podporovat i složitější scénáře (např. kompilaci), * než jen vložení do souboru a přidání správného záhlaví. * * @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 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); if (interpret == null) { System.err.println("Neznámý skriptovací jazyk: " + jazyk); return null; } else { File f = File.createTempFile("xml-web-generátor-", ".skript"); f.deleteOnExit(); PrintStream ps = new PrintStream(f); ps.print("#!"); ps.println(interpret); ps.println(); ps.print(skript); ps.close(); String[] prostředí = new String[]{ "LANG=" + System.getenv("LANG"), "USER=" + System.getenv("USER"), "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í); String výsledek = načtiProud(p.getInputStream()); String chyby = načtiProud(p.getErrorStream()); p.waitFor(); if (p.exitValue() == 0) { if (chyby.length() > 0) { 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 připravVýstup(výsledek, výstupníFormát); } else { System.err.println("--- Standardní výstup skriptu: -----"); System.err.println(výsledek); System.err.println("--- Cyhbový výstup skriptu: ---------"); System.err.println(chyby); System.err.println("--------------------------------------"); throw new RuntimeException("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("--------"); System.err.println(skript); 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(); } } /** * @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; } } }