šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
changeset 94 4b3ba32f613c
child 95 eea9c4713045
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Sat Jun 23 18:00:41 2012 +0200
     1.3 @@ -0,0 +1,131 @@
     1.4 +/**
     1.5 + * XML Web generátor – program na generování webových stránek
     1.6 + * Copyright © 2012 František Kučera (frantovo.cz)
     1.7 + *
     1.8 + * This program is free software: you can redistribute it and/or modify
     1.9 + * it under the terms of the GNU General Public License as published by
    1.10 + * the Free Software Foundation, either version 3 of the License, or
    1.11 + * (at your option) any later version.
    1.12 + *
    1.13 + * This program is distributed in the hope that it will be useful,
    1.14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    1.16 + * GNU General Public License for more details.
    1.17 + *
    1.18 + * You should have received a copy of the GNU General Public License
    1.19 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
    1.20 + */
    1.21 +package cz.frantovo.xmlWebGenerator.makra;
    1.22 +
    1.23 +import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
    1.24 +import java.io.File;
    1.25 +import java.io.PrintStream;
    1.26 +import java.net.URI;
    1.27 +import java.util.Collections;
    1.28 +import java.util.HashMap;
    1.29 +import java.util.Map;
    1.30 +
    1.31 +/**
    1.32 + * Provedeme skript a do stránky vložíme jeho výstup.
    1.33 + *
    1.34 + * @author František Kučera (frantovo.cz)
    1.35 + */
    1.36 +public class Skriptování {
    1.37 +
    1.38 +	/**
    1.39 +	 * klíč = jazyk – např. bash
    1.40 +	 * hodnota = interpret – např. /bin/bash
    1.41 +	 */
    1.42 +	private static final Map<String, String> interpreti;
    1.43 +
    1.44 +	static {
    1.45 +		Map<String, String> podporovanýJazyk = new HashMap<String, String>();
    1.46 +		podporovanýJazyk.put("bash", "/bin/bash");
    1.47 +		podporovanýJazyk.put("perl", "/usr/bin/perl");
    1.48 +		podporovanýJazyk.put("php", "/usr/bin/php");
    1.49 +		podporovanýJazyk.put("python", "/usr/bin/python");
    1.50 +		interpreti = Collections.unmodifiableMap(podporovanýJazyk);
    1.51 +	}
    1.52 +
    1.53 +	/**
    1.54 +	 * TODO: podporovat i složitější scénáře (např. kompilaci),
    1.55 +	 * než jen vložení do souboru a přidání správného záhlaví.
    1.56 +	 *
    1.57 +	 * @param skript program k vykonání
    1.58 +	 * @param jazyk programovací jazyk
    1.59 +	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    1.60 +	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    1.61 +	 * @param perexStránky perex stránky → proměnná prostředí
    1.62 +	 * @return výstup příkazu
    1.63 +	 */
    1.64 +	public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) {
    1.65 +		try {
    1.66 +			System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
    1.67 +			String interpret = interpreti.get(jazyk);
    1.68 +			if (interpret == null) {
    1.69 +				System.err.println("Neznámý skriptovací jazyk: " + jazyk);
    1.70 +				return null;
    1.71 +			} else {
    1.72 +				File f = File.createTempFile("xml-web-generátor-", ".skript");
    1.73 +				f.deleteOnExit();
    1.74 +
    1.75 +				PrintStream ps = new PrintStream(f);
    1.76 +				ps.print("#!");
    1.77 +				ps.println(interpret);
    1.78 +				ps.println();
    1.79 +				ps.print(skript);
    1.80 +				ps.close();
    1.81 +
    1.82 +				f.setExecutable(true);
    1.83 +
    1.84 +				String[] prostředí = new String[]{
    1.85 +					"LANG=" + System.getenv("LANG"),
    1.86 +					"USER=" + System.getenv("USER"),
    1.87 +					"XWG_STRANKA_URI=" + uriStránky,
    1.88 +					"XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()),
    1.89 +					"XWG_STRANKA_NADPIS=" + nadpisStránky,
    1.90 +					"XWG_STRANKA_PEREX=" + perexStránky
    1.91 +				};
    1.92 +
    1.93 +
    1.94 +
    1.95 +				Runtime r = Runtime.getRuntime();
    1.96 +				Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
    1.97 +
    1.98 +				String výsledek = načtiProud(p.getInputStream());
    1.99 +				String chyby = načtiProud(p.getErrorStream());
   1.100 +
   1.101 +				p.waitFor();
   1.102 +
   1.103 +				/**
   1.104 +				 * TODO: podporovat zvláštní návratový kód, kterým skript řekne,
   1.105 +				 * že výstupem je XML a má se vložit jako fragment do dokumentu,
   1.106 +				 * ne jako prostý text.
   1.107 +				 */
   1.108 +				if (p.exitValue() == 0) {
   1.109 +					if (chyby.length() > 0) {
   1.110 +						System.err.println("--- Cyhbový výstup skriptu -----");
   1.111 +						System.err.println(chyby);
   1.112 +						System.err.println("--------------------------------");
   1.113 +					}
   1.114 +
   1.115 +					return výsledek.trim();
   1.116 +				} else {
   1.117 +					System.err.println("--- Standardní výstup skriptu: -----");
   1.118 +					System.err.println(výsledek);
   1.119 +					System.err.println("--- Cyhbový výstup skriptu: ---------");
   1.120 +					System.err.println(chyby);
   1.121 +					System.err.println("--------------------------------------");
   1.122 +					throw new RuntimeException("Návratová hodnota: " + p.exitValue());
   1.123 +				}
   1.124 +			}
   1.125 +		} catch (Exception e) {
   1.126 +			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
   1.127 +			System.err.println("--------");
   1.128 +			System.err.println(skript);
   1.129 +			System.err.println("--------");
   1.130 +			e.printStackTrace(System.err);
   1.131 +			return null;
   1.132 +		}
   1.133 +	}
   1.134 +}