53 |
53 |
54 /** |
54 /** |
55 * TODO: podporovat i složitější scénáře (např. kompilaci), |
55 * TODO: podporovat i složitější scénáře (např. kompilaci), |
56 * než jen vložení do souboru a přidání správného záhlaví. |
56 * než jen vložení do souboru a přidání správného záhlaví. |
57 * |
57 * |
58 * @param skript program k vykonání |
58 * @param skriptText skript k vykonání |
|
59 * @param skriptSoubor cesta k souboru se skriptem/programem |
59 * @param jazyk programovací jazyk |
60 * @param jazyk programovací jazyk |
60 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) |
61 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) |
61 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
62 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
62 * @param nadpisStránky nadpis stránky → proměnná prostředí |
63 * @param nadpisStránky nadpis stránky → proměnná prostředí |
63 * @param perexStránky perex stránky → proměnná prostředí |
64 * @param perexStránky perex stránky → proměnná prostředí |
64 * @return výstup příkazu |
65 * @return výstup příkazu |
65 */ |
66 */ |
66 public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { |
67 public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { |
67 try { |
68 try { |
68 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
69 if (isNeprázdný(skriptSoubor)) { |
69 String interpret = interpreti.get(jazyk); |
70 System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); |
70 if (interpret == null) { |
|
71 System.err.println("Neznámý skriptovací jazyk: " + jazyk); |
|
72 return null; |
|
73 } else { |
71 } else { |
74 File f = File.createTempFile("xml-web-generátor-", ".skript"); |
72 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
|
73 } |
|
74 |
|
75 File souborStránky = new File(new URI(uriStránky)); |
|
76 File f; |
|
77 |
|
78 if (isNeprázdný(skriptText)) { |
|
79 /** Skript je zadán uvnitř elementu přímo ve stránce */ |
|
80 String interpret = interpreti.get(jazyk); |
|
81 if (interpret == null) { |
|
82 throw new Exception("Neznámý skriptovací jazyk: " + jazyk); |
|
83 } |
|
84 |
|
85 f = File.createTempFile("xml-web-generátor-", ".skript"); |
75 f.deleteOnExit(); |
86 f.deleteOnExit(); |
|
87 f.setExecutable(true); |
76 |
88 |
77 PrintStream ps = new PrintStream(f); |
89 PrintStream ps = new PrintStream(f); |
78 ps.print("#!"); |
90 ps.print("#!"); |
79 ps.println(interpret); |
91 ps.println(interpret); |
80 ps.println(); |
92 ps.println(); |
81 ps.print(skript); |
93 ps.print(skriptText); |
82 ps.close(); |
94 ps.close(); |
|
95 } else if (isNeprázdný(skriptSoubor)) { |
|
96 /** Skript/program je uložen v externím souboru */ |
|
97 if (skriptSoubor.startsWith(File.separator)) { |
|
98 /** absolutní cesta */ |
|
99 f = new File(skriptSoubor); |
|
100 } else { |
|
101 /** relativní cesta */ |
|
102 f = new File(souborStránky.getParent(), File.separatorChar + skriptSoubor); |
|
103 } |
|
104 |
|
105 if (!f.canExecute()) { |
|
106 throw new Exception("Soubor se skriptem není spustitelný → nastavte: chmod +x " + f); |
|
107 } |
|
108 } else { |
|
109 throw new Exception("Musí být vyplněn text skriptu, nebo cesta k souboru."); |
|
110 } |
83 |
111 |
84 |
112 |
85 String[] prostředí = new String[]{ |
113 String[] prostředí = new String[]{ |
86 "LANG=" + System.getenv("LANG"), |
114 "LANG=" + System.getenv("LANG"), |
87 "USER=" + System.getenv("USER"), |
115 "USER=" + System.getenv("USER"), |
88 "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", |
116 "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", |
89 "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky |
117 "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky |
90 "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru |
118 "XWG_STRANKA_SOUBOR=" + souborStránky.getAbsolutePath(), // env:absolutní cesta k souboru |
91 "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky |
119 "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky |
92 "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky |
120 "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky |
93 }; |
121 }; |
94 |
122 |
95 f.setExecutable(true); |
123 Runtime r = Runtime.getRuntime(); |
96 Runtime r = Runtime.getRuntime(); |
124 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); |
97 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); |
|
98 |
125 |
99 String výsledek = načtiProud(p.getInputStream()); |
126 String výsledek = načtiProud(p.getInputStream()); |
100 String chyby = načtiProud(p.getErrorStream()); |
127 String chyby = načtiProud(p.getErrorStream()); |
101 |
128 |
102 p.waitFor(); |
129 p.waitFor(); |
103 |
130 |
104 if (p.exitValue() == 0) { |
131 if (p.exitValue() == 0) { |
105 if (chyby.length() > 0) { |
132 if (chyby.length() > 0) { |
106 System.err.println("--- Chybový výstup skriptu -----"); |
133 System.err.println("--- Chybový výstup skriptu -----"); |
107 System.err.println(chyby); |
134 System.err.println(chyby); |
108 System.err.println("--------------------------------"); |
135 System.err.println("--------------------------------"); |
109 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); |
136 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); |
110 } |
137 } |
111 |
138 |
112 return připravVýstup(výsledek, výstupníFormát); |
139 return připravVýstup(výsledek, výstupníFormát); |
113 } else { |
140 } else { |
114 System.err.println("--- Standardní výstup skriptu: -----"); |
141 System.err.println("--- Standardní výstup skriptu: -----"); |
115 System.err.println(výsledek); |
142 System.err.println(výsledek); |
116 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
143 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
117 System.err.println(chyby); |
144 System.err.println(chyby); |
118 System.err.println("--------------------------------------"); |
145 System.err.println("--------------------------------------"); |
119 throw new RuntimeException("Návratová hodnota: " + p.exitValue()); |
146 throw new Exception("Návratová hodnota: " + p.exitValue()); |
120 } |
|
121 } |
147 } |
122 } catch (Exception e) { |
148 } catch (Exception e) { |
123 System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk); |
149 System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk); |
124 System.err.println("--------"); |
150 System.err.println("--------"); |
125 System.err.println(skript); |
151 System.err.println(skriptText); |
126 System.err.println("--------"); |
152 System.err.println("--------"); |
127 e.printStackTrace(System.err); |
153 e.printStackTrace(System.err); |
128 return null; |
154 return null; |
129 } |
155 } |
130 } |
156 } |