16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 */ |
17 */ |
18 package cz.frantovo.xmlWebGenerator.makra; |
18 package cz.frantovo.xmlWebGenerator.makra; |
19 |
19 |
20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; |
20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; |
|
21 import java.io.ByteArrayInputStream; |
21 import java.io.File; |
22 import java.io.File; |
22 import java.io.PrintStream; |
23 import java.io.PrintStream; |
23 import java.net.URI; |
24 import java.net.URI; |
24 import java.util.Collections; |
25 import java.util.Collections; |
25 import java.util.HashMap; |
26 import java.util.HashMap; |
26 import java.util.Map; |
27 import java.util.Map; |
|
28 import javax.xml.parsers.DocumentBuilder; |
|
29 import javax.xml.parsers.DocumentBuilderFactory; |
|
30 import org.w3c.dom.Document; |
27 |
31 |
28 /** |
32 /** |
29 * Provedeme skript a do stránky vložíme jeho výstup. |
33 * Provedeme skript a do stránky vložíme jeho výstup. |
30 * |
34 * |
31 * @author František Kučera (frantovo.cz) |
35 * @author František Kučera (frantovo.cz) |
51 * TODO: podporovat i složitější scénáře (např. kompilaci), |
55 * 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í. |
56 * než jen vložení do souboru a přidání správného záhlaví. |
53 * |
57 * |
54 * @param skript program k vykonání |
58 * @param skript program k vykonání |
55 * @param jazyk programovací jazyk |
59 * @param jazyk programovací jazyk |
|
60 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) |
56 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
61 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
57 * @param nadpisStránky nadpis stránky → proměnná prostředí |
62 * @param nadpisStránky nadpis stránky → proměnná prostředí |
58 * @param perexStránky perex stránky → proměnná prostředí |
63 * @param perexStránky perex stránky → proměnná prostředí |
59 * @return výstup příkazu |
64 * @return výstup příkazu |
60 */ |
65 */ |
61 public static String interpretuj(String skript, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) { |
66 public static String interpretuj(String skript, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { |
62 try { |
67 try { |
63 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
68 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
64 String interpret = interpreti.get(jazyk); |
69 String interpret = interpreti.get(jazyk); |
65 if (interpret == null) { |
70 if (interpret == null) { |
66 System.err.println("Neznámý skriptovací jazyk: " + jazyk); |
71 System.err.println("Neznámý skriptovací jazyk: " + jazyk); |
74 ps.println(interpret); |
79 ps.println(interpret); |
75 ps.println(); |
80 ps.println(); |
76 ps.print(skript); |
81 ps.print(skript); |
77 ps.close(); |
82 ps.close(); |
78 |
83 |
79 f.setExecutable(true); |
|
80 |
84 |
81 String[] prostředí = new String[]{ |
85 String[] prostředí = new String[]{ |
82 "LANG=" + System.getenv("LANG"), |
86 "LANG=" + System.getenv("LANG"), |
83 "USER=" + System.getenv("USER"), |
87 "USER=" + System.getenv("USER"), |
84 "XWG_STRANKA_URI=" + uriStránky, |
88 "XWG_SKRIPTOVANI_JAVA=" + "šablona" + File.separator + "funkce" + File.separator + "src" + File.separator + Skriptování.class.getName().replaceAll("\\.", File.separator) + ".java", |
85 "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), |
89 "XWG_STRANKA_URI=" + uriStránky, // env:URI aktuálně zpracovávané stránky |
86 "XWG_STRANKA_NADPIS=" + nadpisStránky, |
90 "XWG_STRANKA_SOUBOR=" + (new File(new URI(uriStránky)).getAbsolutePath()), // env:absolutní cesta k souboru |
87 "XWG_STRANKA_PEREX=" + perexStránky |
91 "XWG_STRANKA_NADPIS=" + nadpisStránky, // env:nadpis stránky |
|
92 "XWG_STRANKA_PEREX=" + perexStránky // env:perex stránky |
88 }; |
93 }; |
89 |
94 |
90 |
95 |
91 |
96 |
|
97 f.setExecutable(true); |
92 Runtime r = Runtime.getRuntime(); |
98 Runtime r = Runtime.getRuntime(); |
93 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); |
99 Process p = r.exec(new String[]{f.getAbsolutePath()}, prostředí); |
94 |
100 |
95 String výsledek = načtiProud(p.getInputStream()); |
101 String výsledek = načtiProud(p.getInputStream()); |
96 String chyby = načtiProud(p.getErrorStream()); |
102 String chyby = načtiProud(p.getErrorStream()); |
97 |
103 |
98 p.waitFor(); |
104 p.waitFor(); |
99 |
105 |
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 (p.exitValue() == 0) { |
106 if (chyby.length() > 0) { |
107 if (chyby.length() > 0) { |
107 System.err.println("--- Cyhbový výstup skriptu -----"); |
108 System.err.println("--- Chybový výstup skriptu -----"); |
108 System.err.println(chyby); |
109 System.err.println(chyby); |
109 System.err.println("--------------------------------"); |
110 System.err.println("--------------------------------"); |
|
111 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); |
110 } |
112 } |
111 |
113 |
112 return výsledek.trim(); |
114 return připravVýstup(výsledek, výstupníFormát); |
113 } else { |
115 } else { |
114 System.err.println("--- Standardní výstup skriptu: -----"); |
116 System.err.println("--- Standardní výstup skriptu: -----"); |
115 System.err.println(výsledek); |
117 System.err.println(výsledek); |
116 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
118 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
117 System.err.println(chyby); |
119 System.err.println(chyby); |
126 System.err.println("--------"); |
128 System.err.println("--------"); |
127 e.printStackTrace(System.err); |
129 e.printStackTrace(System.err); |
128 return null; |
130 return null; |
129 } |
131 } |
130 } |
132 } |
|
133 |
|
134 private static String připravVýstup(String výsledek, String formát) { |
|
135 if ("xml".equals(formát)) { |
|
136 if (zkontrolujXml(výsledek)) { |
|
137 return výsledek.trim(); |
|
138 } else { |
|
139 System.err.println("Chyba v XML generovaném skriptem:"); |
|
140 System.err.println(výsledek); |
|
141 return null; |
|
142 } |
|
143 } else { |
|
144 return výsledek.trim(); |
|
145 } |
|
146 } |
|
147 |
|
148 /** |
|
149 * @param xml fragment XML vygenerovaný skriptem |
|
150 * @return true v případě, že výstup je validním fragmentem XML |
|
151 */ |
|
152 private static boolean zkontrolujXml(String xml) { |
|
153 try { |
|
154 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
|
155 DocumentBuilder db = dbf.newDocumentBuilder(); |
|
156 xml = "<xml>" + xml + "</xml>"; |
|
157 Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); |
|
158 return true; |
|
159 } catch (Exception e) { |
|
160 e.printStackTrace(System.err); |
|
161 return false; |
|
162 } |
|
163 } |
131 } |
164 } |