diff -r 024ee27ce4fa -r 9224b3d36c61 šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sat Jun 23 21:10:21 2012 +0200 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Sun Jul 01 16:28:13 2012 +0200 @@ -55,7 +55,8 @@ * 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 skriptText skript k vykonání + * @param skriptSoubor cesta k souboru se skriptem/programem * @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í @@ -63,66 +64,91 @@ * @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) { + public static String interpretuj(String skriptText, String skriptSoubor, 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; + if (isNeprázdný(skriptSoubor)) { + System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); } else { - File f = File.createTempFile("xml-web-generátor-", ".skript"); + System.err.println("\tInterpretuji skript v jazyce: " + jazyk); + } + + File souborStránky = new File(new URI(uriStránky)); + File f; + + if (isNeprázdný(skriptText)) { + /** Skript je zadán uvnitř elementu přímo ve stránce */ + String interpret = interpreti.get(jazyk); + if (interpret == null) { + throw new Exception("Neznámý skriptovací jazyk: " + jazyk); + } + + f = File.createTempFile("xml-web-generátor-", ".skript"); f.deleteOnExit(); + f.setExecutable(true); PrintStream ps = new PrintStream(f); ps.print("#!"); ps.println(interpret); ps.println(); - ps.print(skript); + ps.print(skriptText); ps.close(); + } else if (isNeprázdný(skriptSoubor)) { + /** Skript/program je uložen v externím souboru */ + if (skriptSoubor.startsWith(File.separator)) { + /** absolutní cesta */ + f = new File(skriptSoubor); + } else { + /** relativní cesta */ + f = new File(souborStránky.getParent(), File.separatorChar + skriptSoubor); + } + if (!f.canExecute()) { + throw new Exception("Soubor se skriptem není spustitelný → nastavte: chmod +x " + f); + } + } else { + throw new Exception("Musí být vyplněn text skriptu, nebo cesta k souboru."); + } - 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[] 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=" + souborStrá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 + }; - String výsledek = načtiProud(p.getInputStream()); - String chyby = načtiProud(p.getErrorStream()); + Runtime r = Runtime.getRuntime(); + Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); - p.waitFor(); + String výsledek = načtiProud(p.getInputStream()); + String chyby = načtiProud(p.getErrorStream()); - 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."); - } + p.waitFor(); - 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: ---------"); + if (p.exitValue() == 0) { + if (chyby.length() > 0) { + System.err.println("--- Chybový výstup skriptu -----"); System.err.println(chyby); - System.err.println("--------------------------------------"); - throw new RuntimeException("Návratová hodnota: " + p.exitValue()); + 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 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("--------"); - System.err.println(skript); + System.err.println(skriptText); System.err.println("--------"); e.printStackTrace(System.err); return null; @@ -143,6 +169,10 @@ } } + private static boolean isNeprázdný(String s) { + return !(s == null || s.trim().isEmpty()); + } + /** * @param xml fragment XML vygenerovaný skriptem * @return true v případě, že výstup je validním fragmentem XML