root/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java @ 94:4b3ba32f613c

Revision 94:4b3ba32f613c, 4.4 KB (checked in by František Kučera <franta-hg@…>, 12 years ago)

Skriptování: první verze

Line 
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 */
18package cz.frantovo.xmlWebGenerator.makra;
19
20import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
21import java.io.File;
22import java.io.PrintStream;
23import java.net.URI;
24import java.util.Collections;
25import java.util.HashMap;
26import 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 */
33public 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}
Note: See TracBrowser for help on using the browser.