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 static cz.frantovo.xmlWebGenerator.Xmlns.*; |
21 import java.io.ByteArrayInputStream; |
22 import java.io.ByteArrayInputStream; |
22 import java.io.File; |
23 import java.io.File; |
23 import java.io.PrintStream; |
24 import java.io.PrintStream; |
24 import java.net.URI; |
25 import java.net.URI; |
25 import java.util.Collections; |
26 import java.util.Collections; |
26 import java.util.HashMap; |
27 import java.util.HashMap; |
27 import java.util.Map; |
28 import java.util.Map; |
28 import javax.xml.parsers.DocumentBuilder; |
29 import javax.xml.parsers.DocumentBuilder; |
29 import javax.xml.parsers.DocumentBuilderFactory; |
30 import javax.xml.parsers.DocumentBuilderFactory; |
|
31 import javax.xml.transform.Source; |
|
32 import javax.xml.transform.dom.DOMSource; |
30 import org.w3c.dom.Document; |
33 import org.w3c.dom.Document; |
|
34 import org.w3c.dom.Node; |
31 |
35 |
32 /** |
36 /** |
33 * Provedeme skript a do stránky vložíme jeho výstup. |
37 * Provedeme skript a do stránky vložíme jeho výstup. |
34 * |
38 * |
35 * @author František Kučera (frantovo.cz) |
39 * @author František Kučera (frantovo.cz) |
60 * @param jazyk programovací jazyk |
64 * @param jazyk programovací jazyk |
61 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) |
65 * @param výstupníFormát text (výchozí) | xml (v tom případě kontrolujeme validitu) |
62 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
66 * @param uriStránky URI aktuálně generované stránky → proměnná prostředí |
63 * @param nadpisStránky nadpis stránky → proměnná prostředí |
67 * @param nadpisStránky nadpis stránky → proměnná prostředí |
64 * @param perexStránky perex stránky → proměnná prostředí |
68 * @param perexStránky perex stránky → proměnná prostředí |
65 * @return výstup příkazu |
69 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource) |
66 */ |
70 */ |
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) { |
71 public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
|
72 String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); |
|
73 return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát)); |
|
74 } |
|
75 |
|
76 private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { |
|
77 |
68 try { |
78 try { |
69 if (isNeprázdný(skriptSoubor)) { |
79 if (isNeprázdný(skriptSoubor)) { |
70 System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); |
80 System.err.println("\tInterpretuji skript ze souboru: " + skriptSoubor); |
71 } else { |
81 } else { |
72 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
82 System.err.println("\tInterpretuji skript v jazyce: " + jazyk); |
134 System.err.println(chyby); |
144 System.err.println(chyby); |
135 System.err.println("--------------------------------"); |
145 System.err.println("--------------------------------"); |
136 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); |
146 System.err.println("Nicméně skript skončil úspěšně, takže pokračujeme dál."); |
137 } |
147 } |
138 |
148 |
139 return připravVýstup(výsledek, výstupníFormát); |
149 return výsledek.trim(); |
140 } else { |
150 } else { |
141 System.err.println("--- Standardní výstup skriptu: -----"); |
151 System.err.println("--- Standardní výstup skriptu: -----"); |
142 System.err.println(výsledek); |
152 System.err.println(výsledek); |
143 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
153 System.err.println("--- Cyhbový výstup skriptu: ---------"); |
144 System.err.println(chyby); |
154 System.err.println(chyby); |
145 System.err.println("--------------------------------------"); |
155 System.err.println("--------------------------------------"); |
146 throw new Exception("Návratová hodnota: " + p.exitValue()); |
156 throw new Exception("Návratová hodnota: " + p.exitValue()); |
147 } |
157 } |
148 } catch (Exception e) { |
158 } catch (Exception e) { |
149 System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk); |
159 System.err.println("Došlo k chybě při vykonávání skriptu."); |
150 System.err.println("--------"); |
160 System.err.println("--------"); |
151 System.err.println(skriptText); |
161 System.err.println(skriptText); |
152 System.err.println("--------"); |
162 System.err.println("--------"); |
153 e.printStackTrace(System.err); |
163 e.printStackTrace(System.err); |
154 return null; |
164 throw e; |
155 } |
|
156 } |
|
157 |
|
158 private static String připravVýstup(String výsledek, String formát) { |
|
159 if ("xml".equals(formát)) { |
|
160 if (zkontrolujXml(výsledek)) { |
|
161 return výsledek.trim(); |
|
162 } else { |
|
163 System.err.println("Chyba v XML generovaném skriptem:"); |
|
164 System.err.println(výsledek); |
|
165 return null; |
|
166 } |
|
167 } else { |
|
168 return výsledek.trim(); |
|
169 } |
165 } |
170 } |
166 } |
171 |
167 |
172 private static boolean isNeprázdný(String s) { |
168 private static boolean isNeprázdný(String s) { |
173 return !(s == null || s.trim().isEmpty()); |
169 return !(s == null || s.trim().isEmpty()); |
174 } |
170 } |
175 |
171 |
176 /** |
172 /** |
177 * @param xml fragment XML vygenerovaný skriptem |
173 * @param zadání výstup vygenerovaný skriptem |
178 * @return true v případě, že výstup je validním fragmentem XML |
174 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text |
|
175 * @return xml fragment nebo prostý text zabalený do html/body |
|
176 * @throws Exception |
179 */ |
177 */ |
180 private static boolean zkontrolujXml(String xml) { |
178 private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { |
181 try { |
179 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
182 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
180 DocumentBuilder db = dbf.newDocumentBuilder(); |
183 DocumentBuilder db = dbf.newDocumentBuilder(); |
181 Document d; |
184 xml = "<xml>" + xml + "</xml>"; |
182 |
185 Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); |
183 if (xmlFormát) { |
186 return true; |
184 try { |
187 } catch (Exception e) { |
185 zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>"; |
188 e.printStackTrace(System.err); |
186 d = db.parse(new ByteArrayInputStream(zadání.getBytes())); |
189 return false; |
187 } catch (Exception e) { |
|
188 System.err.println("Chyba: Skript vrátil neplatné XML."); |
|
189 throw e; |
|
190 } |
|
191 } else { |
|
192 d = db.newDocument(); |
|
193 Node html = d.createElementNS(XHTML, "html"); |
|
194 Node body = d.createElementNS(XHTML, "body"); |
|
195 Node text = d.createTextNode(zadání); |
|
196 body.appendChild(text); |
|
197 html.appendChild(body); |
|
198 d.appendChild(html); |
190 } |
199 } |
|
200 |
|
201 return new DOMSource(d); |
191 } |
202 } |
192 } |
203 } |