šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
author František Kučera <franta-hg@frantovo.cz>
Sat Jun 23 18:00:41 2012 +0200 (2012-06-23)
changeset 94 4b3ba32f613c
child 95 eea9c4713045
permissions -rw-r--r--
Skriptování: první verze
     1 /**
     2  * XML Web generátor – program na generování webových stránek
     3  * Copyright © 2012 František Kučera (frantovo.cz)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, either version 3 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License
    16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    17  */
    18 package cz.frantovo.xmlWebGenerator.makra;
    19 
    20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
    21 import java.io.File;
    22 import java.io.PrintStream;
    23 import java.net.URI;
    24 import java.util.Collections;
    25 import java.util.HashMap;
    26 import java.util.Map;
    27 
    28 /**
    29  * Provedeme skript a do stránky vložíme jeho výstup.
    30  *
    31  * @author František Kučera (frantovo.cz)
    32  */
    33 public class Skriptování {
    34 
    35 	/**
    36 	 * klíč = jazyk – např. bash
    37 	 * hodnota = interpret – např. /bin/bash
    38 	 */
    39 	private static final Map<String, String> interpreti;
    40 
    41 	static {
    42 		Map<String, String> podporovanýJazyk = new HashMap<String, String>();
    43 		podporovanýJazyk.put("bash", "/bin/bash");
    44 		podporovanýJazyk.put("perl", "/usr/bin/perl");
    45 		podporovanýJazyk.put("php", "/usr/bin/php");
    46 		podporovanýJazyk.put("python", "/usr/bin/python");
    47 		interpreti = Collections.unmodifiableMap(podporovanýJazyk);
    48 	}
    49 
    50 	/**
    51 	 * TODO: podporovat i složitější scénáře (např. kompilaci),
    52 	 * než jen vložení do souboru a přidání správného záhlaví.
    53 	 *
    54 	 * @param skript program k vykonání
    55 	 * @param jazyk programovací jazyk
    56 	 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí
    57 	 * @param nadpisStránky nadpis stránky → proměnná prostředí
    58 	 * @param perexStránky perex stránky → proměnná prostředí
    59 	 * @return výstup příkazu
    60 	 */
    61 	public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) {
    62 		try {
    63 			System.err.println("\tInterpretuji skript v jazyce: " + jazyk);
    64 			String interpret = interpreti.get(jazyk);
    65 			if (interpret == null) {
    66 				System.err.println("Neznámý skriptovací jazyk: " + jazyk);
    67 				return null;
    68 			} else {
    69 				File f = File.createTempFile("xml-web-generátor-", ".skript");
    70 				f.deleteOnExit();
    71 
    72 				PrintStream ps = new PrintStream(f);
    73 				ps.print("#!");
    74 				ps.println(interpret);
    75 				ps.println();
    76 				ps.print(skript);
    77 				ps.close();
    78 
    79 				f.setExecutable(true);
    80 
    81 				String[] prostředí = new String[]{
    82 					"LANG=" + System.getenv("LANG"),
    83 					"USER=" + System.getenv("USER"),
    84 					"XWG_STRANKA_URI=" + uriStránky,
    85 					"XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()),
    86 					"XWG_STRANKA_NADPIS=" + nadpisStránky,
    87 					"XWG_STRANKA_PEREX=" + perexStránky
    88 				};
    89 
    90 
    91 
    92 				Runtime r = Runtime.getRuntime();
    93 				Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí);
    94 
    95 				String výsledek = načtiProud(p.getInputStream());
    96 				String chyby = načtiProud(p.getErrorStream());
    97 
    98 				p.waitFor();
    99 
   100 				/**
   101 				 * TODO: podporovat zvláštní návratový kód, kterým skript řekne,
   102 				 * že výstupem je XML a má se vložit jako fragment do dokumentu,
   103 				 * ne jako prostý text.
   104 				 */
   105 				if (p.exitValue() == 0) {
   106 					if (chyby.length() > 0) {
   107 						System.err.println("--- Cyhbový výstup skriptu -----");
   108 						System.err.println(chyby);
   109 						System.err.println("--------------------------------");
   110 					}
   111 
   112 					return výsledek.trim();
   113 				} else {
   114 					System.err.println("--- Standardní výstup skriptu: -----");
   115 					System.err.println(výsledek);
   116 					System.err.println("--- Cyhbový výstup skriptu: ---------");
   117 					System.err.println(chyby);
   118 					System.err.println("--------------------------------------");
   119 					throw new RuntimeException("Návratová hodnota: " + p.exitValue());
   120 				}
   121 			}
   122 		} catch (Exception e) {
   123 			System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);
   124 			System.err.println("--------");
   125 			System.err.println(skript);
   126 			System.err.println("--------");
   127 			e.printStackTrace(System.err);
   128 			return null;
   129 		}
   130 	}
   131 }